我使用netty implementation 'io.netty:netty-all:4.1.65.Final'
作为我的WebSocket服务器,现在我想为应用程序添加心跳。我试图做的是从客户端发送ping消息,并从服务器端返回pong消息。现在我面临的问题是,服务器端总是将客户端ping消息视为纯文本帧,而不是控制帧。这是服务器端代码如下:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (null != msg && msg instanceof FullHttpRequest) {
FullHttpRequest request = (FullHttpRequest) msg;
String uri = request.uri();
Map paramMap=getUrlParams(uri);
if(uri.contains("?")){
String newUri=uri.substring(0,uri.indexOf("?"));
System.out.println(newUri);
request.setUri(newUri);
}
}else if(msg instanceof TextWebSocketFrame){
TextWebSocketFrame frame=(TextWebSocketFrame)msg;
}else if(msg instanceof PingWebSocketFrame){
PingWebSocketFrame frame=(PingWebSocketFrame)msg;
}
super.channelRead(ctx, msg);
}
字符串
代码总是运行到TextWebSocketFrame
,我试过从客户端发送ping消息如下:
const heartbeatInterval = setInterval(() => {
if (chatWebsocket && chatWebsocket.readyState === WebSocket.OPEN) {
const pingFrame = new ArrayBuffer(2);
const pingView = new DataView(pingFrame);
pingView.setInt8(0, 0x89);
pingView.setInt8(1, 0);
chatWebsocket.send(pingFrame);
}
}, HEARTBEAT_INTERVAL_MS);
型
就像这样
const heartbeatInterval = setInterval(() => {
if (chatWebsocket && chatWebsocket.readyState === WebSocket.OPEN) {
chatWebsocket.send('Ping');
}
}, HEARTBEAT_INTERVAL_MS);
型
我还试了这个
const heartbeatInterval = setInterval(() => {
if (chatWebsocket && chatWebsocket.readyState === WebSocket.OPEN) {
chatWebsocket.send('ping');
}
}, HEARTBEAT_INTERVAL_MS);
型
我也试过这个:
const heartbeatInterval = setInterval(() => {
if (chatWebsocket && chatWebsocket.readyState === WebSocket.OPEN) {
chatWebsocket.send('');
}
}, HEARTBEAT_INTERVAL_MS);
型
这些都不能工作。我应该做些什么来使它工作?我错过了什么吗?
1条答案
按热度按时间w8f9ii691#
您可以创建Ping消息作为Netty
PingWebSocketFrame
的示例并发送它。类似于下面的代码示例。字符串