-1

我正在尝试编写一个异步套接字应用程序,该应用程序在两侧传输复杂的对象..

我在这里使用了这个例子......

一切都很好,直到我尝试发送多包数据。当传输的数据需要多个包传输时,服务器应用程序正在挂起并且服务器失控而没有任何错误...

几个小时后,我找到了解决方案;如果我在每次 EndSend 回调后关闭客户端发送方套接字,则问题正在解决。但我不明白为什么这是必要的?或者对于这种情况还有其他解决方案吗?

我的 (2) 项目与上面的示例相同,只是我更改了 EndSend 回调方法,如下所示:

    public void EndSendCallback(IAsyncResult result)
    {
        Status status = (Status)result.AsyncState;
        int size = status.Socket.EndSend(result);
        status.Socket.Close(); // <--------------- This line solved the situation
        Console.Out.WriteLine("Send data: " + size + " bytes.");
        Console.ReadLine();
        allDone.Set(); 
    }

谢谢..

4

1 回答 1

0

这是由于给出的示例代码没有处理多个包(并且被破坏)。

几点观察:

  • 服务器一次只能处理 1 个客户端。
  • 服务器只是检查传入的数据是否在一次读取中小于请求的数据,如果是,则假定这是最后一部分。
  • 然后服务器在保持连接打开的同时忽略客户端套接字。这将关闭连接的责任放在客户端,这可能会造成混淆,并且会浪费服务器上的资源。

现在第一个观察结果是一个实现细节,与您的情况并不真正相关。第二个观察与您相关,因为它可能会导致无法解释的错误 - 可能不是在开发中 - 但是当这段代码实际上是在真实场景中的某个地方运行时。套接字不是流线型的。当客户端发送超过 1000 个字节时。这可能需要在服务器上调用 1 次或 10 次读取。只要有“一些”数据可用,读取调用就会返回。您需要做的是实现某种协议,以传达正在发送多少数据或何时发送所有数据。我真的建议坚持使用 HTTP 协议,因为这是一个经过良好测试且支持良好的协议,适合大多数场景。

第三个观察结果也可能导致服务器资源不足的错误,因为它使所有连接都处于打开状态。

于 2012-09-09T05:43:48.497 回答