弹簧腹板断管和客户端未收到消息

时间:2016-11-14 16:01:00

标签: java spring websocket sockjs

使用websockets时遇到一些问题:

  • java.io.IOException: Broken Pipe
  • 客户端不接收消息 TL; DR

我想知道的主要事项:

  • 请列出客户端关闭连接的所有可能方案(除了刷新或关闭选项卡)。
  • 除了服务器通过断开的连接向客户端发送消息之外,是否会发生损坏的管道异常?如果是,那怎么样?
  • 虽然服务器确实发送了心跳,但服务器不发送消息的可能情况有哪些? (当发生这种情况时,我需要重新启动应用程序才能再次运行。这是一个糟糕的解决方案,因为它已经在生产中。)

<小时/> 我有一个使用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);
    }
}

2 个答案:

答案 0 :(得分:1)

只是一个有根据的猜测:检查你的网络设备。也许有错误配置的防火墙终止这些连接;甚至更糟糕的是,破坏的网络设备导致连接终止。如果您的服务器有多个NIC(可能是这种情况),那么使用这些NIC或通过不同的NIC连接到服务器时也可能存在一些配置错误。

答案 1 :(得分:1)

如果这个问题意外发生,而你可能遇到任何缓存问题 - 请检查spring或SocksJS是否有自己的套接字交互缓存。

这是在您的设备上(或您控制的设备上)发生的吗?

此外,我建议您使用一些网络数据包分析器,如wireshark。使用此类工具,您将看到当前网络活动“在线”

可以在没有正确停止连接的情况下解析连接的一些外部原因(如果没有连接检查,则无法管理连接):

  • device suspend / poweroff
  • 网络故障
  • 浏览器关闭时出现一些错误

我认为这是破坏连接的可能原因的完整列表的一小部分。