Netty:正确关闭WebSocket

Netty:正确关闭WebSocket,websocket,netty,Websocket,Netty,如何从服务器端正确关闭WebSocket通道/连接?如果我使用ctx.getChannel().close(),则会抛出Brwoser(Firefox 9)中的onerror: 加载页面时,与ws://localhost:8080/websocket的连接中断 我还尝试在WebSocketServerHandler中的channelClosed-方法中发送CloseWebSocketFrame: public void channelClosed(ChannelHandlerContext ct

如何从服务器端正确关闭WebSocket通道/连接?如果我使用
ctx.getChannel().close()
,则会抛出Brwoser(Firefox 9)中的
onerror

加载页面时,与ws://localhost:8080/websocket的连接中断

我还尝试在
WebSocketServerHandler
中的
channelClosed
-方法中发送
CloseWebSocketFrame

public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
        throws Exception {
    CloseWebSocketFrame close = new CloseWebSocketFrame();
    ctx.getChannel().write(close);
}

这会引发一个
ClosedChannelException
(可能相关?)

您使用的是什么版本

您是否尝试过这样做:

ctx.getChannel().write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);

您必须这样做:

ch.write(new CloseWebSocketFrame());
然后服务器将关闭连接。如果连接没有很快关闭,可以调用
ch.close()

如何

ctx.getChannel().write(new CloseWebSocketFrame()).addListener(ChannelFutureListener.CLOSE);

这将发送CloseWebSocketFrame,然后关闭频道。

否。仍然存在
ClosedChannelException
CloseWebSocketFrame
的构造函数包含
ChannelBuffers.EMPTY\u BUFFER
。我想我需要使用
CloseWebSocketFrame
。RFC6455()定义:1001表示端点正在“离开”,例如服务器正在关闭或浏览器已经离开页面。这就是我想要使用的。版本:我正在使用我的分支()。由于Netty是模块化的,我不能再编译它了。对于其他像我一样通过google来到这里的人来说:我在玩http频道,对我来说这就是确切的解决方案。在WebSocket连接建立后,我的管道看起来是这样的:
[wsdecoder,wsencoder,webSocketHandler,myDecoder,myEncoder,app]
。因此WebSocketHandler将数据转发到解码器,直到它到达应用程序。问题是,
应用程序
对如何使用它一无所知。所以它根本不知道管道中有一个WebSocketHandler。与此类似,
app
也可用于具有非WebSocket连接的其他管道中。即使我将应用程序中的
CloseWebSocketFrame
写入
频道
,它也会被编码,直到到达
WebSocketServerHandler
我刚刚测试了一个问题:管道任何一层的
ch.write(…)
都会穿过整个管道(从最后一个处理程序到第一个处理程序)?我希望它只是从我们执行
ch.write(…)
的层返回,因为我上一次引入了
ChannelClosing
类。我正在这个频道上写一个实例:
ch.write(newchannelclosing())。如果我在解码器(它将我的应用程序数据转换为WebSocket)中发现了这一点,我将切换到
CloseWebSocketFrame
。它起作用了。