我正在用C#编写即时消息服务器用于学习目的。 我的问题是我是否应该使用同步或异步套接字来处理IM客户端。目标是尽可能多地处理客户。
我不太确定但据我所知,对于异步套接字,数据包没有按顺序到达,这意味着当您发送2条聊天消息并且存在延迟/延迟时,第二条消息可能在到达之前到达第一。这是对的,如果有的话,有没有办法解决这个问题?
关于同步套接字:同步套接字是许多客户端的理想解决方案吗?如果有新数据包,是否必须检查循环中的每个套接字/连接?如果是这样,这不是很慢吗?
最后一个问题:假设我想实现一种通过协议(非标准二进制协议btw)发送文件(例如图像)的方法,我还可以在上传时发送消息吗?
答案 0 :(得分:8)
目标是尽可能多地处理客户。
然后是异步。它扩展得更好。
我不太确定但据我所知,对于异步套接字,数据包没有按顺序到达,这意味着当您发送2条聊天消息并且存在延迟/延迟时,第二条消息可能在到达之前到达第一个。
TCP保证一切按顺序到达。
假设我想实现一种通过协议(非标准二进制协议btw)发送文件(例如图像)的方法,我还可以在上传时发送消息
我建议您使用单独的连接进行文件传输。使用第一个连接进行握手(确定要使用的端口并指定文件名等)。然后在新套接字上使用Socket.SendFile
来传输文件。
答案 1 :(得分:4)
@jgauffin所说的一切(即TCP处理数据包顺序,对n(clients) > 1000
更好的异步)。
假设我想实现一种通过协议(非标准二进制协议btw)发送文件(例如图像)的方法,我还可以在上传时发送消息吗?
必须构建自定义协议以支持此功能。如果您向Socket写入8MB数据包,则在发送8MB之前,您将无法使用该套接字写入任何其他内容。相反,使用较小尺寸的上传块,以便其他数据包也有机会越过管道。
[UPLOAD id=123 START length=8012389]
[UPLOAD id=123 PART chunk=1 length=2048 data=...]
[UPLOAD id=123 PART chunk=2 length=2048 data=...]
[MESSAGE to="foo@example.com" text="Hi"]
[UPLOAD id=123 PART chunk=3 length=2048 data=...]
// ...
[UPLOAD id=123 COMPLETE checksum=0xdeadbeef]
答案 2 :(得分:2)
异步方法和同步方法之间的区别更多的是非阻塞和阻塞io之间的区别。使用这两种方法,数据的传送顺序与传送的顺序相同。但是,在等待异步调用完成时不会阻塞,因此在任何单个通信完成写入套接字之前,您可以开始向所有客户端发送(这就是为什么通常这样做的方法然后是服务器)。
如果沿着同步路由走,则会阻塞,直到每个传输/接收操作完成,这意味着可能需要运行多个线程来处理客户端。
至于在发送消息的同时上传图像,您可能希望在客户端/服务器之间的不同管道连接中处理该图像,以便它不会导致阻塞。