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);
}
}