TCP传输数据

这篇具有很好参考价值的文章主要介绍了TCP传输数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP客户端

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;

public class TCPClient
{
    /// <summary>
    /// 客户端
    /// </summary>
    private TcpClient tcpClient;
    private NetworkStream stream;

    public TCPClient(string ip, int port)
    {
        try
        {
            //初始化客户端
            tcpClient = new TcpClient(ip, port); // 连接到指定的服务器地址和端口
            stream = tcpClient.GetStream();

            // 开始接收数据
            byte[] buffer = new byte[1024];
            stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReceiveCallback), buffer);
        }
        catch (Exception e)
        {
            Debug.Log("错误Error: " + e.Message);
        }
    }

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="message"></param>
    public void Send(string message)
    {
        if (stream == null)
        {
            Debug.Log("Error: TCP connection is not established.");
            return;
        }

        byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
        stream.Write(data, 0, data.Length);
        Debug.Log("Sent message: " + message);
    }
    int a;
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Send("我是小偷" + a++);
        }
    }
    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="ar"></param>
    private void ReceiveCallback(IAsyncResult ar)
    {
        int bytesRead = stream.EndRead(ar);
        if (bytesRead == 0)
        {
            return;
        }
        byte[] data = (byte[])ar.AsyncState;
        string message = System.Text.Encoding.UTF8.GetString(data, 0, bytesRead);
        Debug.Log("收到消息Received message: " + message);

        // 继续监听下一条消息
        stream.BeginRead(data, 0, data.Length, new AsyncCallback(ReceiveCallback), data);
    }

    public void SocketQuit()
    {
        if (tcpClient != null)
        {
            tcpClient.Close();
        }
    }
}

TCP服务器

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;

public class TCPServer
{
    /// <summary>
    /// 客户端
    /// </summary>
    private Socket socketClient;
    /// <summary>
    /// 服务器
    /// </summary>
    private Socket socketServer;
    /// <summary>
    /// 监听线程
    /// </summary>
    private Thread thread;
    private Thread r_thread;

    /// <summary>
    /// 开启服务器监听
    /// </summary>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    public TCPServer(string ip, int port)
    {
        socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress iPAddress = IPAddress.Parse(ip);
        EndPoint endPoint = new IPEndPoint(iPAddress, port);
        socketServer.Bind(endPoint);
        socketServer.Listen(5);
        //监听连接
        thread = new Thread(ReceiveFromClient);
        thread.IsBackground = true;
        thread.Start(socketServer);
    }

    /// <summary>
    /// 监听连接的客户端
    /// </summary>
    /// <param name="obj"></param>
    private void ReceiveFromClient(object obj)
    {
        try
        {
            Socket socketWatch = obj as Socket;
            while (true)
            {
                socketClient = socketWatch.Accept();
                r_thread = new Thread(ReceiveMsg);
                r_thread.IsBackground = true;
                r_thread.Start(socketClient);
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e.Message);
        }
    }

    /// <summary>
    /// 接收数据
    /// </summary>
    /// <param name="obj"></param>
    public void ReceiveMsg(object obj)
    {
        Socket socket = obj as Socket;
        while (true)
        {
            byte[] buffer = new byte[1024];
            int length = socket.Receive(buffer);
            if (length == 0)
            {
                return;
            }
            byte[] dataCache = new byte[length];

            for (int i = 0; i < length; i++)
            {
                //存储数据
                dataCache[i] = buffer[i];
            }
            string message = System.Text.Encoding.UTF8.GetString(dataCache);
            Debug.Log("收到消息Received message: " + message);
        }
    }

   public void Send(string sendStr)
   {
        //清空发送缓存
        byte[] sendData = new byte[1024];
        //数据类型转换
        sendData = Encoding.UTF8.GetBytes(sendStr);
        //发送
        socketClient.Send(sendData, sendData.Length, SocketFlags.None);
        Debug.Log("Sent message: " + sendStr);
    }

    /// <summary>
    /// 关闭
    /// </summary>
    public void SocketQuit()
    {
        if (socketClient != null)
        {
            socketClient.Close();
        }
        if (thread != null)
        {
            thread.Interrupt();
            thread.Abort();
        }
        if (r_thread != null)
        {
            r_thread.Interrupt();
            r_thread.Abort();
        }
        if (socketServer != null)
        {
            socketServer.Close();
        }

        Debug.Log("关闭服务器");
    }
}

文章来源地址https://www.toymoban.com/news/detail-818512.html

到了这里,关于TCP传输数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT下TCP协议实现数据网络传输

    QT开发框架以其跨平台的优势,在全世界IT界如雷贯耳。其封装了功能齐全的各种类,大大的提高了开发者的效率。本篇内容将介绍如何使用QT 6.4.1框架开发服务器和客户端程序,让两端能够首发消息,服务端往客户端发送文件(客户端往服务器发送类似,没有实现)。  说明

    2023年04月08日
    浏览(47)
  • 详解TCP/IP协议第三篇:通信数据在OSI通信模型的上下传输

    😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月09日
    浏览(44)
  • Socket TCP/IP协议数据传输过程中的粘包和分包问题

    一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解: 下面对上面的图进行解释: 1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。 2.粘包情况:Socket Client发送的数据包,

    2024年02月12日
    浏览(44)
  • 通信模型四层(TCP/IP)、五层、七层(OSI)的作用、协议及数据传输单位

    四层模型 五层模型 七层模型 每层作用 物理层:传输比特流 数据链路层:控制网络层和物理层之间的通信 网络层:IP寻址和路由选择 传输层:建立、维护、管理端到端连接 会话层:建立、维护、管理会话连接 表示层:数据格式化,加密、解密、 应用层:为应用程序提供网

    2024年02月03日
    浏览(46)
  • TCP/IP传输协议学习

    1.发送方源终端设备的应用创建数据。 2.当数据在源终端设备中沿协议栈向下传递,对其分段和封装。 3.在协议栈网络接入层的介质上生成数据。 4.通过由介质和任意中间设备组成的网际层网络传输数据。 5.在目的终端设备中沿协议栈向上传递时对其解封和重组。   1.TCP/IP协

    2024年02月09日
    浏览(39)
  • 数据链路层(MAC)、网络层(IP)、传输层(TCP/UDP)抓包分析

    OSI模型(OSI model),开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI)。 抓包通常抓取数据链路层、网络层、传输层的包。 OSI主要关注5层,数据从上至下逐级封装,加入每层的头部信息,在物理层转换为比特率发送; 接收端使用逆向顺序

    2024年02月16日
    浏览(53)
  • 【网络】传输层TCP协议

    目录 一、概述 2.1 运输层的作用引出 2.2 传输控制协议TCP 简介 2.3 TCP最主要的特点 2.4 TCP连接 二、TCP报文段的首部格式 三、TCP的运输连接管理 3.1 TCP的连接建立(三次握手) 3.2 为什么是三次握手? 3.3 为何两次握手不可以呢? 3.4 TCP的连接释放(四次挥手) 3.5 为什么客户端在TIME

    2024年01月23日
    浏览(41)
  • 【网络编程】传输层协议——TCP协议

    TCP报头当中各个字段的含义如下 源/目的端口号 :表示数据是从哪个进程来,到发送到对端主机上的哪个进程。 32位序号/32位确认序号 :分别代表TCP报文当中每个字节数据的编号以及对对方的确认,是TCP保证可靠性的重要字段。 4位TCP报头长度 :表示该TCP报头的长度,以4字

    2024年02月17日
    浏览(59)
  • 【计算机网络】网络协议五层模型下的各层数据传输的结构(以TCP包为例)

    1.应用层      应用层的数据就是我们写的代码的内容。比如我要传一个字符串 “hello wolrd” 到目的主机,那么 报文M 就表示的是 hello world 的二进制(0 1)形式。      应用层就是我们主机的应用程序的那一层。比如你用 visual studio运行了你写好的代码程序,正在运行的代

    2024年02月03日
    浏览(50)
  • 【计算机网络】传输层协议 -- TCP协议

    认识可靠性 现在的计算机大多都是基于冯诺依曼体系结构的 虽然这里的输入设备、输出设备、内存、CPU是在同一个机器上的,但是它们彼此间却是相互独立的。如果它们之间要进行通信,那就必须要用“线”连接起来,其中连接内存和外设之间的“线”叫做IO总线,连接CP

    2024年02月14日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包