Unity开发之网络一TCP客户端实现

网络开发系列

Unity开发之网络—集成Protobuf

Unity开发之网络一HTTP客户端实现

Unity开发之网络一HTTP服务端实现

下面介绍Sockt通信的实现,和Http相比Tcp/IP实现要复杂一些。不过使用C#语言开发要容易了很多。为什么这样说呢,因为以前写过使用C++实现Socket通信,在项目中已经编写完成,但因为外因,项目没有上线,最后日志也不了了之

跨平台客户端Socket 一 数据包定义

下面介绍使用C#实现Socket通信,包体结构及定义从C++修改而来。

主要涉及三个类SocketModule,ClientSocket,ClientSocketHelper

SocketModule:定义包头结构,ClientSocket的接收连接等接口,以及其他定义

ClientSocket:网络连接的具体实现

ClientSocketHelper:二次封装,方便应用层调用

ClientSocket主要代码如下:

网络连接

需要注意的是连接时要检测是否是IPV6的网络,否则iOS无法通过审核。连接成功会开启接收线程和心跳包检测定时任务。

接收:

接收线程主要是对网络传递的数据流解析为定义的数据包,要注意的是数据的连包和沾包处理。

数据发送

心跳检测

在ClientSocket的变量定义中有一个:

通过这个变量将消息传递出去

ClientSocketHelper 实现这个接口,并接收来自ClientSocket的消息

应用层又是如果接收到最终的数据呢,通过代理的方式

示例

因为在消息的传递过程中,是在自定义的线程中(接收线程)处理的,需要将消息传送到主线程中,方便Unity的调用。和HTTP封装类类似,需要在Update中将消息分发到具体的处理类中。

具体参考HTTP客户端的实现。

因为涉及的内容比较多,就定这些吧,使用Socket通信需要注意的有:

1.网络连接重试,可能第一次未连接上,需要多试几次;

2.断线重连处理,移动应用网络不稳定,网络断线重连对用户透明;

3.应用退到后台,iOS会自动断开,Android不会,所以加逻辑断开;

4.IPV6的支持,曾因这个被拒了两次。

下一篇介绍服务端的实现