使用websockets时遇到一些问题:
java.io.IOException: Broken Pipe
我想知道的主要事项:
<小时/> 我有一个使用
SpringMVC
的{{1}}项目; websockets
客户端和SockJS
服务器端。
生成org.springframework.web.socket.handler.TextWebSocketHandler
服务器端并发送给客户端。有时,我得到JSON
。我google / StackOverflowed很多,发现太多我不理解的东西,但原因可能是连接是客户端关闭,服务器仍然发送消息(例如,心跳)。听起来不错吗?这种例外的其他原因是什么?客户端关闭连接的原因是什么(刷新或关闭选项卡除外)?
此外,有时客户端不会从服务器获取任何消息,尽管服务器应该发送它们。我在发送消息之前和之后进行登录,并打印两个日志语句。有谁知道为什么会发生这种情况?我在Chrome的控制台日志中没有错误。刷新页面不起作用,我需要重新启动spring项目......
如果您需要更多信息,请发表评论。
<小时/> 客户端
java.io.IOException: Broken Pipe
服务器端
服务
function connect() {
var socket = new SockJS('/ws/foo');
socket.onopen = function () {
socket.send(fooId); // ask server for Foo with id fooId.
};
socket.onmessage = function (e) {
var foo = JSON.parse(e.data);
// Do something with foo.
};
}
WebSocketHandler
@Service
public class FooService implements InitializingBean {
public void updateFoo(...) {
// Update some fields of Foo.
...
// Send foo to clients.
FooUpdatesHandler.sendFooToSubscribers(foo);
}
}
答案 0 :(得分:1)
只是一个有根据的猜测:检查你的网络设备。也许有错误配置的防火墙终止这些连接;甚至更糟糕的是,破坏的网络设备导致连接终止。如果您的服务器有多个NIC(可能是这种情况),那么使用这些NIC或通过不同的NIC连接到服务器时也可能存在一些配置错误。
答案 1 :(得分:1)
如果这个问题意外发生,而你可能遇到任何缓存问题 - 请检查spring或SocksJS是否有自己的套接字交互缓存。
这是在您的设备上(或您控制的设备上)发生的吗?
此外,我建议您使用一些网络数据包分析器,如wireshark。使用此类工具,您将看到当前网络活动“在线”
可以在没有正确停止连接的情况下解析连接的一些外部原因(如果没有连接检查,则无法管理连接):
我认为这是破坏连接的可能原因的完整列表的一小部分。