gpt4 book ai didi

java - Spring websockets Broken pipe & client 没有收到消息

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:34 27 4
gpt4 key购买 nike

我在使用 websockets 时遇到了一些问题:

  • java.io.IOException: Broken Pipe
  • 客户端没有收到消息
    长话短说

我想知道的主要事情:

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


我有一个使用 websocketsSpringMVC 项目; SockJS 客户端和 org.springframework.web.socket.handler.TextWebSocketHandler 服务器端。

JSON 在服务器端生成并发送给客户端。有时,我会收到 java.io.IOException: Broken Pipe。我在 google/StackOverflow 上搜索了很多,发现了太多我不明白的东西,但原因可能是客户端关闭了连接,而服务器仍在发送消息(例如,心跳)。这听起来不错吗?出现此异常的其他原因是什么?客户端关闭连接的原因是什么(刷新或关闭选项卡除外)?

此外,有时客户端不会从服务器收到任何消息,尽管服务器应该发送它们。我在发送消息之前和之后都进行了记录,并且打印了两个日志语句。有谁知道为什么会发生这种情况?我在 Chrome 的控制台日志中没有错误。刷新页面不行,我需要重启spring项目...

如果您需要更多信息,请发表评论。


客户端

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.
};
}

服务器端
服务

@Service
public class FooService implements InitializingBean {
public void updateFoo(...) {
// Update some fields of Foo.
...
// Send foo to clients.
FooUpdatesHandler.sendFooToSubscribers(foo);
}
}

网络套接字处理器

public class FooUpdatesHandler extends ConcurrentTextWebSocketHandler {
// ConcurrentTextWebSocketHandler taken from https://github.com/RWTH-i5-IDSG/BikeMan (Apache License version 2.0)

private static final Logger logger = LoggerFactory.getLogger(FooUpdatesHandler.class);
private static final ConcurrentHashMap<String, ConcurrentHashMap<String, WebSocketSession>> fooSubscriptions =
new ConcurrentHashMap<>();

public static void sendFooToSubscribers(Foo foo) {
Map<String, WebSocketSession> sessionMap = fooSubscriptions.get(foo.getId());

if (sessionMap != null) {
String fooJson = null;
try {
fooJson = new ObjectMapper().writeValueAsString(foo);
} catch (JsonProcessingException ignored) {
return;
}

for (WebSocketSession subscription : sessionMap.values()) {
try {
logger.info("[fooId={} sessionId={}] Sending foo...", foo.getId(), subscription.getId());
subscription.sendMessage(new TextMessage(fooJson));
logger.info("[fooId={} sessionId={}] Foo send.", foo.getId(), subscription.getId());
} catch (IOException e) {
logger.error("Socket sendFooToSubscribers [fooId={}], exception: ", foo.getId(), e);
}
}
}
}
}

最佳答案

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

关于java - Spring websockets Broken pipe & client 没有收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592910/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com