关于这段时间踩的Socket的坑

本文旨在构建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是这样,在其他的我不清楚)

一般步骤

1.定义连接(侦听)的端口号,IP地址,再定义侦听(连接)的端口号和地址

2.设定 套接字 ,开辟新线程

3.中文传输(读取)要使用UTF-8

4.关闭时要先 Interrupt(); 再Abort(); ,最后Close

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值