WebSocket 远程端点处于状态 [TEXT_PARTIAL_WRITING]
我用 tomcat 8.0.15, spring 4.1.5.
我实施了 3 强制性的使用功能 websocket, 如下所示。
一切都很简单。
一个客户端发消息,其他客户接收邮件 handleTextMessage.
在我的情况下,没有函数 handleTextMessage, 服务器程序希望向客户发送短信。
/为此,我保存了标识符 WebSocketSession 和用户名 map_id/
上面的代码非常好。
但是当一些客户端 WebSocketSession 使用并尝试同时使用,犯了一个错误。
它的意思是
1. 有些客户发送消息 --> handleTextMessage 叫 --> 客户 WebSocketSession 用途
2. 服务器程序希望向此客户端发送消息 -> 收到 WebSocketSession 客户带地图 -> 尝试使用相同的消息发送消息 WebSocketSession
因此 WebSocketSession 关闭,客户必须打开一个新的 WebSocketSession.
所以,我的问题是:
我可以检查它是否使用 WebSocketSession 或不?
/在功能之外 handleTextMessage/
</string,></string,>
我实施了 3 强制性的使用功能 websocket, 如下所示。
一切都很简单。
private Map<string, websocketsession=""> map_users = new ConcurrentHashMap<>//;
private Map<string, string=""> map_id = new ConcurrentHashMap<>//;
public void afterConnectionEstablished/WebSocketSession wss/ throws Exception {
map_users.put/wss.getId//, wss/;
}
public void afterConnectionClosed/WebSocketSession wss, CloseStatus cs/ throws Exception {
map_users.remove/wss.getId///;
// remove user
String username = map_id.get/wss.getId///;
if /username != null/ {
map_id.remove/wss.getId///;
map_id.remove/username/;
}
}
public void handleTextMessage/WebSocketSession wss, TextMessage tm/ throws Exception {
String str = tm.getPayload//;
String username = ...;
// regist user
if /!map_id.get/wss.getId//// {
map_id.put/wss.getId//, username/;
map_id.put/username, wss.getId///;
}
for /WebSocketSession w: map_users.values/// {
w.sendMessage/new TextMessage/wss.getId// + " send to " + w.getId// + ", msg:" + tm.getPayload////;
}
}
一个客户端发消息,其他客户接收邮件 handleTextMessage.
在我的情况下,没有函数 handleTextMessage, 服务器程序希望向客户发送短信。
/为此,我保存了标识符 WebSocketSession 和用户名 map_id/
String websocketsesssion_id = map_id.get/username/;
WebSocketSession wss = map_users.get/websocketsesssion_id/;
wss.sendMessage/new TextMessage/new java.util.Date////;
上面的代码非常好。
但是当一些客户端 WebSocketSession 使用并尝试同时使用,犯了一个错误。
它的意思是
1. 有些客户发送消息 --> handleTextMessage 叫 --> 客户 WebSocketSession 用途
2. 服务器程序希望向此客户端发送消息 -> 收到 WebSocketSession 客户带地图 -> 尝试使用相同的消息发送消息 WebSocketSession
Stacktrace:] with root cause
java.lang.IllegalStateException: The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid state for called method
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState/WsRemoteEndpointImplBase.java:1092/
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textPartialStart/WsRemoteEndpointImplBase.java:1050/
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString/WsRemoteEndpointImplBase.java:218/
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText/WsRemoteEndpointBasic.java:49/
at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendTextMessage/StandardWebSocketSession.java:197/
at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage/AbstractWebSocketSession.java:105/
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.writeFrameInternal/WebSocketServerSockJsSession.java:222/
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame/AbstractSockJsSession.java:325/
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.sendMessageInternal/WebSocketServerSockJsSession.java:212/
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendMessage/AbstractSockJsSession.java:161/
因此 WebSocketSession 关闭,客户必须打开一个新的 WebSocketSession.
所以,我的问题是:
我可以检查它是否使用 WebSocketSession 或不?
/在功能之外 handleTextMessage/
</string,></string,>
没有找到相关结果
已邀请:
3 个回复
二哥
赞同来自:
样本 :
郭文康
赞同来自:
有助于连接 ws://, 它没有帮助
. 它 100% 如果您尝试在阅读部分消息时发送部分消息,则失败。 我检查了它 Spring Boot 1.4.2 RELEASE /tomcat 8.5.6/
与此同样 tomcat 8.5.9. 见堆栈 trace 以下。
帅驴
赞同来自:
TEXT_PARTIAL_READY
会议 websocket 也许已经在
State.TEXT_PARTIAL_WRITING
另一个流,如在此处的代码中所示
https://www.codota.com/web/ass ... L1182