如果PC C的一个UDP端口同时收到PC A,和PC B 发送的数据,C是怎么处理呢?都放入缓存?然后再分别处理?还是在放入缓存前就有个队列,一个个来?还是会报错? |
|
什么叫“同时”?你的程序上是不可能“同事收到”的,因为程序是顺序 Receive 操作的。只不过,当你收到之后,你可以在子线程中进行业务处理,而不用等处理完毕才开始下一个 Receive 操作。
而在多子线程中并发处理业务,根本用不着什么“队列”,因为多线程(或者系统线程池管理机制)本身就能够保存保存各自的运行数据。除非真的有什么特别的额外要求,否则那种“死读java书”的人津津乐道的抄袭来的什么“消息队列”概念就是多余的。 |
|
10分 |
注意,在.net中要使用UdpClient 类,而不要使用 Socket 类!
它跟 tcp 的机制完全不一样,它只能处理很短很小的数据(几十k大小),一次收到一个完整包,既不存在分包也不存在粘包,因此也不需要消息缓存。 同时你也不需要在服务器端保存客户端的连接通道对象,每收到一个消息包你都分别需要使用 Receive 操作的第二个参数来获取客户端 EndPoint,以便用来作为返回信息的地址。 |
udp 服务程序编写起来非常方便,非常简洁。要比tcp服务处理简单多了。
但是,udp在互联网上基本上成功率能有30%就不错了,所以它通常用于发送毫不重要、可以随意丢弃的一些简单通知。 由于不可靠性,因此它不实用。即使你编写udp通讯程序,你还需要使用tcp或者http作为udp通讯失败后的补救手段。 |
|
大师,我的意思是,假如A,和B的包同时到达C,这样会不会造成报错?我是用的单线程 |
|
不存在同时到达,底层数据包都是顺序到达,在缓冲区里排队的 |
|
15分 |
一个时刻,以太网上只有一个数据桢在传输,你应该知道冲突处理机制,所以,在同一个瞬间,是不可能有两个信号在以太网上传输的,所以,也就不存在同时到达的问题。
|
15分 |
以太网网线其实就是2对双绞线,1对负责发送,1对负责接收
所谓信号,数据,不过是一组1,0,1,0,在线路里就是高电平低电平 数据必须是串行的,不能并行 |
谢谢各位,懂了
|