多线程服务器,独立发送数据?

时间:2012-02-06 13:54:19

标签: c#

我正在尝试构建一个简单的多线程tcp服务器。客户端连接并向服务器发送数据,服务器响应并再次等待数据。问题是我需要服务器在单独的线程中侦听传入的数据,并且能够随时向客户端发送命令(例如,通知新的更新)。据我所知,当客户端向服务器发送数据时,如果服务器没有响应任何数据,客户端应用程序不允许我发送更多数据,服务器根本就不接收它们。如果我以数据方式发送数据,是否需要为tcpclient“确认”数据?

以下是服务器的来源:http://csharp.net-informations.com/communications/files/print/csharp-multi-threaded-server-socket_print.htm

如何在“DoChat”函数循环之外的单独线程中将服务器命令发送到客户端?或者我必须处理该线程中的所有内容?我必须回复客户发送给我的每个请求吗?谢谢!

1 个答案:

答案 0 :(得分:1)

  

问题是我需要服务器在单独的线程中监听传入的数据

不,有一个异步API。您可以轮询一个线程列表,以查看等待哪些新数据,显然是从工作线程中完成的。

  

据我所知,当客户端向服务器发送数据时,如果服务器没有响应任何内容   数据,客户端应用程序不允许我发送更多数据,服务器根本不接收它们。

与套接字的工作方式相比,这是更多的垃圾编程。套接字完全可以同时在发送和接收方向上进行流式传输。

  

如何在“DoChat”之外的单独线程中将服务器发送命令到客户端   功能

恩,亲爱的,你的工作要花钱。

但是:这个例子是迟钝的。作为完全反模式。每个客户一个线程? 1000多个客户连接后,您将遇到记忆问题和性能问题。你得到了大量的上下文切换。

其次,客户端不是异步的,因为它不是这样写的。 Mayy我建议giong阅读文档,阅读sockts试图自己构建它?然后回来的问题不仅仅是“我只是想复制粘贴”。

通过适当的编程,这是完全正常的。我在开发过程中有类似的应用程序,将数据发送到客户端并从客户端获取命令以修改数据流。作品是一种魅力。

  

如果我以数据方式发送数据,是否需要为tcpclient“确认”数据?

是和否。不,不是TCP - TCP它是否会在引擎盖下进行握手。是的,如果您的协议决定它必须,这是程序员级别的设计决策。取决于数据的内容,它可能是必需的,也可能不是必需的。有时候确认提供了更多的信息(时间戳服务器端,跟踪数字),而且“我得到它”并不纯粹。