本文旨在构建Socket模型,着重讨论Socket的UDP传输模型中的坑点。具体代码不做过多讨论,随便百度就有了。
1.前置知识
- TCP/IP的基础模型
端口模型:
协议
a.TCP协议
b,UDP传输
UDP支持双向链接,当Client链接到Server之后,Server创建client,链接到A的Client创建的server上
简单点理解,就是雌雄同体(莫名色情起来)
代码支持:IN Untiy
客户端:
以下代码进行过删减,我们只对部分代码做详细讨论,完整代码请自行搜索 Unity+UDP通信 字样
void InitSocket()
{
1.定义客户端连接的IP地址,端口号。以及客户端生成的服务端侦听的IP地址,端口号。
ipEnd = new IPEndPoint(IPAddress.Parse(“127.0.0.1”), 7401);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
serverEnd = (EndPoint)sender;
2.开启一个线程连接,这里必须要开一个线程,即使Unity不支持多线程,也得这么开。
connectThread = new Thread(new ThreadStart(SocketReceive));
connectThread.Start();
}
void SocketSend(string sendStr)
{
//清空
sendData = new byte[1024];
//数据转换
sendData = Encoding.UTF8.GetBytes(sendStr);
//发送给指定服务端
socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
}
//接收服务器信息
void SocketReceive()
{
3.这里必须这么写
while (true)
{
recvData = new byte[1024];
try
{
recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
}
catch (Exception e)
{
}
print("信息来自: " + serverEnd.ToString());
if (recvLen > 0)
{
4.UTF8的编码,保证传输过去的中文不是乱码
recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
}
print(recvStr);
}
}
//连接关闭
void SocketQuit()
{
//关闭线程
if (connectThread != null)
{
connectThread.Interrupt();
connectThread.Abort();
}
//最后关闭socket
if (socket != null)
socket.Close();
}
void OnApplicationQuit()
{
SocketQuit();
}
UDP大坑!!!!!!!!!!!!!!!!!!
1.关于Localhost和127.0.0.1
LocalHost是系统给你默认绑好的,你也可以更改。在IPV6中,它还默认指向 ::1
LocHost是域名,127.0.0.1是IP地址(IPV4)
2.如何告知对方自己要结束通信了
因为目前所做的,是传输字符串,只要双方约定好一个“结束词”,
那么就可以通过识别“结束词”的方式,判断否对方挂断了。
例如:if(recvStr=="!@!@@&#*(!@&!)(*@") { SocketQuit(); }
3.如果遇到了,我们需要在外面写一个button,来控制通信结束
很简单,先发送报文,然后再关闭线程。这些都由Button自己完成,而不是交给Client自己完成。
因为子线程无法完成主线程的函数(在Unity是这样,在其他的我不清楚)