【问题标题】:TCPListener / TCPClient Server-Client Writing / Reading dataTCPListener / TCPClient Server-Client 写入/读取数据
【发布时间】:2012-01-22 10:21:15
【问题描述】:

在这里,我正在解决有关服务器和客户端如何在机器上工作的理论问题。我知道所有 NET 进程,但我缺少一些关于代码的东西。我找不到与此相关的内容。

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

项目1(客户)

Project2(服务器)

我的问题可能就这么简单:

1-> 关于服务器如何接收数据,事件处理程序可能吗? 在我的第一个服务器代码中,我曾经制作过这个循环:

while (true)
{

if (NetworkStream.DataAvailable)
    {
        //stuff
    }

Thread.Sleep(200);
}

我认为这是一种控制来自服务器的传入数据的糟糕方法。但是服务器始终准备好接收数据。

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

AcceptTcpClient();

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

2-> 通用网络 I/O 方法。

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

这可能吗?

【问题讨论】:

  • 1) NetworkStream.Read(buffer,...,...) 是一个阻塞调用。你不需要那个奇怪的while循环。 2) the sending can break if I send more data。不,您可以安全地使用NetworkStream.Write(buffer,...,...)

标签: c# event-handling client networkstream


【解决方案1】:

关于服务器如何接收数据,事件处理程序是可能的?

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

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

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

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

如果你真的想发送 数据,你可以使用 SCTP,但要注意许多防火墙会丢弃 SCTP 数据包,因为它们不是“常见的”。我不知道您是否可以通过开放的 Internet 可靠地路由 SCTP 数据包。

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

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

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

你只需要处理这个。

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2011-09-04
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2019-01-02
    相关资源
    最近更新 更多