TCPListener / TCPClient服务器 - 客户端写入/读取数据

时间:2011-12-17 00:52:15

标签: c# event-handling client networkstream

好的,所以我在这里解决一个关于HOW服务器和客户端正在使用机器的问题。我知道所有的.NET进程,但我遗漏了一些引用代码的东西。我无法找到与此相关的内容。

我在Visual C#2008中编码,我使用常规TCPClient / TCPListener和2个不同的项目:

Project1(客户端)

Project2(服务器)

我的问题可能很简单:

1-> 关于服务器如何接收数据,可以使用事件处理程序? 在我用于制作此循环的第一个服务器代码中:

while (true)
{

if (NetworkStream.DataAvailable)
    {
        //stuff
    }

Thread.Sleep(200);
}

我认为这是一种控制来自服务器的传入数据的垃圾方式。但服务器随时可以接收数据。

我的问题:有什么像......? - >

AcceptTcpClient();

我想要一个等待事情发生的处理程序,在这种情况下是一个特定的套接字数据接收。

2-> 常规网络I / O方法。

问题是(除了我是菜鸟)是如何处理多个数据写入。 如果我用来在字节数组中发送大量数据,如果我发送更多数据,发送可能会中断。所有数据都已加入,并在接收时发生错误。我想处理多个发送和接收的写入。

这可能吗?

1 个答案:

答案 0 :(得分:1)

  

关于服务器如何接收数据,可以使用事件处理程序吗?

如果您想编写面向回调的服务器代码,您可能会发现MSDN的Asynchronous Server Socket Example正是您正在寻找的内容。

  

...如果发送更多数据,发送可能会中断。所有数据都已加入,并在接收时发生错误。

这是TCP的本质。标准化的互联网协议分为几类:

             block oriented    stream oriented
reliable          SCTP              TCP
unreliable         UDP              ---

如果您确实要发送数据,可以使用SCTP,但请注意许多防火墙DROP SCTP数据包因为它们不是“通常”。我不知道你是否可以在开放的互联网上可靠地路由SCTP数据包。

您可以使用自己的标题将自己的内容包装到数据块中,或者为系统添加其他“同步”机制。考虑一个HTTP服务器:它必须等到它读取entire request之后:

GET /index.html HTTP/1.1␍␊
Host: www.example.com␍␊
␍␊

在服务器看到CRLFCRLF序列之前,它必须将部分读取的数据保存在缓冲区中。这些字节可能会在十几个或更多数据包中一次出现一个。或者,如果客户端在单个流中发送多个请求,则可能会在一个数据包中发出十二个请求。

你必须处理这个问题。