好的,所以我在这里解决一个关于HOW服务器和客户端正在使用机器的问题。我知道所有的.NET进程,但我遗漏了一些引用代码的东西。我无法找到与此相关的内容。
我在Visual C#2008中编码,我使用常规TCPClient / TCPListener和2个不同的项目:
Project1(客户端)
Project2(服务器)
我的问题可能很简单:
1-> 关于服务器如何接收数据,可以使用事件处理程序? 在我用于制作此循环的第一个服务器代码中:
while (true)
{
if (NetworkStream.DataAvailable)
{
//stuff
}
Thread.Sleep(200);
}
我认为这是一种控制来自服务器的传入数据的垃圾方式。但服务器随时可以接收数据。
我的问题:有什么像......? - >
AcceptTcpClient();
我想要一个等待事情发生的处理程序,在这种情况下是一个特定的套接字数据接收。
2-> 常规网络I / O方法。
问题是(除了我是菜鸟)是如何处理多个数据写入。 如果我用来在字节数组中发送大量数据,如果我发送更多数据,发送可能会中断。所有数据都已加入,并在接收时发生错误。我想处理多个发送和接收的写入。
这可能吗?
答案 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序列之前,它必须将部分读取的数据保存在缓冲区中。这些字节可能会在十几个或更多数据包中一次出现一个。或者,如果客户端在单个流中发送多个请求,则可能会在一个数据包中发出十二个请求。
你必须处理这个问题。