TCP和UDP传输介绍
1.TCP协议通信需要在服务器与客户端之间建立连接。服务器端通过服务器方创建的端口接受客户端连接,客户端通过客户端方创建的端口socket发送消息、接收消息。服务器端通过在客户端连接服务器时创建的端口socket向客户端发送消息、接受消息。
2.UDP协议通信不需要建立连接,也无服务器与客户端之分,传输消息只需要向特定端口发送消息即可。
3.协议通信包括同步通信和异步通信
4.图解
- 服务器创建套接字socket,绑定端口,监听端口,并开启接受连接
- 客户端创建套接字socket,绑定端口,连接服务器
- 当客户端连接服务器时,服务器端将创建客户端socket副本并保存
- 客户端socket可以向服务器发送报文
- 服务器通过客户端socket副本发送报文
- 服务器端创建套接字socket,绑定端口,开启接受消息
- 客户端创建套接字socket,绑定端口,开启接受消息
- 服务器端通过本身socket向指定端口发送消息
- 客户端通过本身socket向指定端口发送消息
同步通信:
接受连接:Accept()
接收消息:Receive()
发送消息:Send()
异步通信:
开始异步接受连接:BeginAccept()
当有连接请求时,触发回调函数:EndAccept()
开始异步接受消息:BeginReceive()
当有消息到达时,触发回调函数:EndReceive ()
TCP通信实例:
创建服务器
public void CreateServer()
{
//创建TCP协议套接字
listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAdr = IPAddress.Parse("192.168.1.112");
IPEndPoint ipEp = new IPEndPoint(ipAdr, 1234);
//listenfd.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); //端口复用
listenfd.Bind(ipEp); //绑定端口
listenfd.Listen(maxConn); //监听,maxConn是允许客户端连接的最大数量
listenfd.BeginAccept(AcceptCb, null); //开启异步连接,当有客户端连接时,触发回调函数AcceptCb()
}
private void AcceptCb(IAsyncResult ar)
{
try
{
Socket socket = listenfd.EndAccept(ar); //为连接客户端创建新的socket副本
//功能语句
conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn); //对所连接客户端开始异步接收消息,当有客户端发送消息时触发回调函数ReceiveCb()
}
listenfd.BeginAccept(AcceptCb, null);
}
catch (Exception e)
{
}
}
public void ReceiveCb(IAsyncResult ar)
{
Conn conn = (Conn)ar.AsyncState;
try
{
int count = conn.socket.EndReceive(ar);//获取接收到的字节流的长度
//功能语句
}
//开启异步接收消息,当接收到消息时,触发回调函数ReceiveCb()
conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn);
}
catch (Exception)
{
}
}
创建客户端:
public void ConnectServer()
{
//创建TCP协议套接字
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string host = "192.168.1.112";
int port = 1234;
try
{
//连接服务器
socket.Connect(host, port);
//开启异步接收消息
socket.BeginReceive(readBuff, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCb, null);
}
catch (Exception e)
{
socket.Close(); //关闭socket
}
}
private void ReceiveCb(IAsyncResult ar)
{
try
{
//功能语句
//开启异步接收消息
socket.BeginReceive(readBuff, buffCount, BUFFER_SIZE - buffCount, SocketFlags.None, ReceiveCb, null);
}
catch (Exception)
{
}
}
UDP通信实例
创建客户端
public void CreateServer()
{
if (server == null)
{
//创建UDP套接字
server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
}
//绑定端口
server.Bind(new IPEndPoint(IPAddress.Parse(serverIPAddress), serverEndPoint));//绑定端口号和IP
//新建线程接收数据
receiveThread = new Thread(ReciveMsg);
receiveThread.Start();
// Debug.Log("服务器创建成功");
}
private void ReciveMsg()
{
while (m_IsReceive)
{
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
byte[] buffer01 = new byte[1024 * 256];
try
{
int length = server.ReceiveFrom(buffer01, ref point);//接收数据
}
catch (Exception e)
{
// Debug.Log(e);
}
// inputBufferQueue.Enqueue(buffer);
}
}
创建客户端
private void CreateClient()
{
//创建UDP套接字
m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定端口
m_Socket.Bind(new IPEndPoint(IPAddress.Parse(clientIPAddress), clientEndPoint));
receiveThread = new Thread(ReciveMsg);
receiveThread.Start();
//新建显示屏幕
Debug.Log("客户端已经开启");
}
private void ReciveMsg()
{
while (m_IsReceive)
{
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
try
{
byte[] buffer = new byte[1024 * 64]; //udp传输包的最大限制是1024*64
int length = m_Socket.ReceiveFrom(buffer, ref point);//接收数据报
texBufferQue.Add(buffer); //将数据放入缓冲区
}
catch (Exception e)
{
Debug.Log(e);
}
//Sort(texBufferQue);
}
}
本人第一次接触网络传输编程,这是在工作中经过学习,自己积累了对网络传输的一些了解。如有不对的地方希望各位看到之后指出,也希望各位能进行补充。希望不会对各位读者产生误解!
谢谢