我正在实现 Jetty 的 WebSocket.OnTextMessage。当我在 onMessage(String) 中收到消息时,我可以使用之前从 onOpen(Connection) 获取的 Connection 对象进行回复,并且客户端会正确接收它。
但是,当我想使用 connection.sendMessage(String) 从服务器推送消息(即没有来自客户端的初始消息)时,客户端不会收到它。似乎消息正在被缓冲,但我找不到任何方法来刷新它。
有谁知道如何解决这个问题?也许我做的是不正确的。这就是我所做的
public void onOpen(final Connection connection) {
this.connection = connection;
}
然后在另一个事件
public void onReceive(BytesXMLMessage bytesXMLMessage) {
byte[] data = ((BytesMessageImpl) bytesXMLMessage).getData();
String msgToClient = new String(data);
this.connection.sendMessage(msgToClient);
System.out.println("onReceive:" + msgToClient);
}
但是客户端从未收到该消息
更新:找到模式,无论是大写还是小写,只要包含HTTP方法关键字(例如GET,POST,PUT,HEAD等),消息将永远不会发送给客户端。
有没有办法缓解这个问题?
更新:这是可以模拟问题的非常简化的 WebSocketServlet 实现
package com.test.websocket;
import org.eclipse.jetty.websocket.WebSocket;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class WebSocketServlet extends org.eclipse.jetty.websocket.WebSocketServlet {
@Override
public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
return new WebSocket.OnTextMessage() {
private Connection connection;
@Override
public void onMessage(String data) {
try {
connection.sendMessage("Echo: " + data);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onOpen(Connection connection) {
this.connection = connection;
}
@Override
public void onClose(int closeCode, String message) {
connection.close();
}
};
}
}
这是 web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<servlet>
<servlet-name>EchoWebSocket</servlet-name>
<servlet-class>com.test.websocket.WebSocketServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EchoWebSocket</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>