Socket
服务端至少要两个socket:一个负责接收客户端连接请求,但不负责与客户端通信;为每个连接成功的客户端,在服务端创建一个对应的socket负责与客户端通信。
客户端的socket一个就行:要指定连接的服务端的IP和端口。
通讯过程:
- 申请一个socket
- 绑定IP和端口
- 监听
- 服务端接收到连接请求,产生一个新的socket,与客户端建立连接并通讯。
- 原监听socket继续监听
构造函数:
- AddressFamily代表寻址方案,InterNetwork表示IPV4连接。
- SocketType代表要打开的Socket类型。
- ProtocolType代表请求协议。
通信流程:
-------------------------------------------
客户端 服务端
------------- --------------
Socket() Socket()
Bind()
Listen()
Connect() <==> Accept()
Send() ==> Receive()
Receive() <== Send()
Close() Close()
------------------------------------------------
TCP与UDP的区别:
TCP:传输控制协议是一种面向连接、可靠的、基于字节流的、运输层通信协议。
- 面向连接的协议数据传输必须要先建立连接;
- 一旦连接建立,双方可以按统一大小的格式传输数据;
- 可靠的:确保接收方完全正确的获取发送方所发送的全部数据。
UDP:用户数据包协议,面向事务的、无连接的、不可靠的传输协议。
- 数据报文中有完整的地址信息,所以不建立连接就发送了。
- 传输数据有大小限制,64KB以内。
- 不可靠:发送的数据并不一定以相同的次序到达接收方。
长链接与短连接:
长连接:一直建立连接,所有的线程都结束,程序才会退出。
短连接:需要的时候才建立连接,任务一结束就中断连接。
阻塞与非阻塞:
阻塞:发一个消息如果服务器不返回,客户端会一直等。调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞:调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
同步和异步:
同步和异步关注的是消息通信机制。
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
Unity协同程序:
他并不是真正意义上的并行,实际上是通过迭代器来实现的,通过关键字IEnumerator来定义一个迭代方法,yield返回。