C#:关于套接字编程的问题(同步或异步)

时间:2011-03-21 12:49:34

标签: c# sockets asynchronous

我正在用C#编写即时消息服务器用于学习目的。 我的问题是我是否应该使用同步或异步套接字来处理IM客户端。目标是尽可能多地处理客户。

我不太确定但据我所知,对于异步套接字,数据包没有按顺序到达,这意味着当您发送2条聊天消息并且存在延迟/延迟时,第二条消息可能在到达之前到达第一。这是对的,如果有的话,有没有办法解决这个问题?

关于同步套接字:同步套接字是许多客户端的理想解决方案吗?如果有新数据包,是否必须检查循环中的每个套接字/连接?如果是这样,这不是很慢吗?

最后一个问题:假设我想实现一种通过协议(非标准二进制协议btw)发送文件(例如图像)的方法,我还可以在上传时发送消息吗?

3 个答案:

答案 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之间的区别。使用这两种方法,数据的传送顺序与传送的顺序相同。但是,在等待异步调用完成时不会阻塞,因此在任何单个通信完成写入套接字之前,您可以开始向所有客户端发送(这就是为什么通常这样做的方法然后是服务器)。

如果沿着同步路由走,则会阻塞,直到每个传输/接收操作完成,这意味着可能需要运行多个线程来处理客户端。

至于在发送消息的同时上传图像,您可能希望在客户端/服务器之间的不同管道连接中处理该图像,以便它不会导致阻塞。