Unity3dTCP,UDP通信小总结

1.TCP和UDP是两种不同的传输层协议

(1)TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议。它通过建立客户端与服务器之间的可靠连接来进行通信,确保数据的完整性和顺序性。TCP使用流控制、拥塞控制和重传机制等方式来保证可靠性。

(2)UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议。它不需要在客户端和服务器之间建立连接,直接使用数据报方式传输数据。UDP的优点在于传输速度快,但缺点是数据在传输过程中可能会丢失或乱序。

Socket是一个通信端点的描述符,是应用层与传输层之间的接口。它提供了一组用于创建、绑定、连接、发送和接收数据的函数。通过Socket,应用程序可以与其他应用程序建立网络连接,并进行数据的传输。

在使用Socket进行网络通信时,可以根据不同的需求选择使用TCP或UDP。使用TCP时,建立连接后可以进行可靠的数据传输。而使用UDP时,可以实现更快速的数据传输,但不能保证数据的可靠性。无论是使用TCP还是UDP,都是通过Socket接口来发送和接收数据。

①.在应用层使用TCP时,可以通过Socket接口来创建TCP连接、发送和接收数据。

②.在应用层使用UDP时,同样可以使用Socket接口来发送和接收UDP数据包。

TCP和UDP是不同的传输层协议,而Socket是应用层与传输层之间进行通信的接口,可以使用Socket来创建、绑定、连接、发送和接收数据,选择使用TCP或UDP取决于应用的需求。

-----------------------------------------------------------------------------------------------------------------

2.TCP协议发送消息代码示例:

using UnityEngine;
using System.Net.Sockets;
using System.Text;

public class TCPSend : MonoBehaviour
{
    public string ipAddress = "127.0.0.1"; // 目标IP地址
    public int port = 1234; // 目标端口

    private TcpClient tcpClient;
    private NetworkStream networkStream;

    private void Start()
    {
        tcpClient = new TcpClient();
        tcpClient.Connect(ipAddress, port);
        networkStream = tcpClient.GetStream();
    }

    private void OnDestroy()
    {
        if (networkStream != null)
            networkStream.Close();
        if (tcpClient != null)
            tcpClient.Close();
    }

    public void SendMessage(string message)
    {     
        byte[] data = Encoding.UTF8.GetBytes(message);
        networkStream.Write(data, 0, data.Length);
        networkStream.Flush();
    }
}

TCP协议服务器接收消息:

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

public class TCPServer : MonoBehaviour
{
    public int port = 1234; // 监听的端口

    private TcpListener tcpListener;
    private bool isListening = true;

    private void Start()
    {
        tcpListener = new TcpListener(IPAddress.Any, port);
        tcpListener.Start();

        Thread thread = new Thread(ListenForClients);
        thread.Start();
    }

    private void OnDestroy()
    {
        tcpListener.Stop();
    }

    private void ListenForClients()
    {
        while (isListening)
        {
            TcpClient client = tcpListener.AcceptTcpClient();

            Thread clientThread = new Thread(HandleClient);
            clientThread.Start(client);
        }
    }

    private void HandleClient(object clientObj)
    {
        TcpClient client = (TcpClient)clientObj;
        NetworkStream networkStream = client.GetStream();

        byte[] buffer = new byte[1024];
        int bytesRead;

        while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);

            // 在这里可以对接收到的消息进行处理
            Debug.Log("接收到消息:" + receivedMessage);
        }

        client.Close();
    }
}

---------------------------------------------------------------------------------------------------------------------------------

3.UDP协议发送消息

using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPSend : MonoBehaviour
{
    public string ipAddress = "127.0.0.1"; // 目标IP地址
    public int port = 1234; // 目标端口

    private UdpClient udpClient;

    private void Start()
    {
        udpClient = new UdpClient();
    }

    private void OnDestroy()
    {
        udpClient.Close();
    }

    public void SendMessage(string message)
    {
        byte[] data = Encoding.UTF8.GetBytes(message);
        udpClient.Send(data, data.Length, ipAddress, port);
    }
}

UDP协议接收消息

using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPReceive : MonoBehaviour
{
    public int port = 1234; // 接收消息的端口

    private Socket udpSocket;
    private byte[] receiveBuffer = new byte[1024]; // 接收缓冲区大小

    private void Start()
    {
        udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
        udpSocket.Bind(endPoint);

        StartReceive();
    }

    private void OnDestroy()
    {
        udpSocket.Close();
    }

    private void StartReceive()
    {
        EndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0);
        udpSocket.BeginReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ref senderEndPoint, ReceiveCallback, null);
    }

    private void ReceiveCallback(System.IAsyncResult ar)
    {
        int bytesRead = udpSocket.EndReceive(ar);
        string receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, bytesRead);

        // 在这里可以对接收到的消息进行处理
        Debug.Log("接收到消息:" + receivedMessage);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值