我正在使用C#WebSocket服务器(目前由http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17支持)。 服务器正在使用.NET的Socket对象来监听服务器以及每个客户端发送和接收消息。
我构建了一个连接到服务器的Web客户端,它可以成功连接,我可以在客户端之间发送消息。
一切都很好!
现在,如果我连接到服务器并离开客户端一段时间而不发送消息,服务器会抛出一个异常,说:
Int32发送(Byte [],Int32,Int32,System.Net.Sockets.SocketFlags): 现有连接被远程主机强行关闭。
例外情况,你可以看到来自服务器中客户端套接字的Send方法,这看起来非常有线,因为我没有从客户端发送任何数据,也没有人向这个客户端发回数据,所以如何可以是Send方法可以抛出异常以及抛出此异常的原因吗?
答案 0 :(得分:0)
我假设你已经排除了服务器和客户端之间不同协议的使用(愚蠢的假设,但你永远不知道)。
如果您的代码在没有事先从客户端接收的情况下到达Send方法,则很明显服务器代码出现问题。使用跟踪和/或日志获取更多信息,即使是abc就像进入等待接收,接收,接收,退出接收等一样。
答案 1 :(得分:0)
这叫做超时!
WebSockets只是TCP / IP原始套接字(.NET中的Socket类)的包装器 - 如果没有发送任何内容,则会超时,并且没有任何东西可以使连接保持活动状态。
AFAIK目前WebSocket API的定义并不明确,只要如何保持连接活跃。我遇到了同样的事情,不得不切换到使用ping(空消息)来保持连接活着(我正在使用Microsoft套接字实现)。
如果你是reinventing the wheel非最终规范,请记住,每次规格变化时你都必须不断重新发明它。我特意选择使用Microsoft套接字预览,这样当它发布时我几乎不需要更改任何代码。我没有在IIS中运行 - 我作为一个控制台应用程序运行,它到目前为止工作非常好,但我的用户非常少。
注意:我遇到的问题导致我发现这个问题,如果我在没有收到回复的情况下发送10条消息,那么连接就会关闭。我仍然在研究这是为什么 - 无论是WebSockets的bug /功能还是Socket类的功能。我有可能达到65kb的限制,但我的信息很小,我不认为这就是原因。在测试你所做的任何事情时都要注意这一点,因为它会给你带来同样的错误。