我有来自Official Netty的Echo服务器示例 Echo Server
如何添加从websocket连接和流式传输的功能?
这是我的ServerHandler代码:
public class ServerHandler extends ChannelInboundHandlerAdapter
{
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
super.channelRegistered(ctx);
// !!!!! Think here should be WebSocket Handshake?
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
{
System.out.println(msg);
ctx.write(msg);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx)
{
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
{
// Close the connection when an exception is raised.
cause.printStackTrace();
}
}
目前Chrome连接说:WebSocket连接到' ws://127.0.0.1:8080 /'失败:WebSocket握手期间出错:状态行无效
答案 0 :(得分:1)
Netty服务器不会自动处理所有协议,因此您需要添加对WebSockets的支持。
我发现最好的起点是检查Netty的xref页面中的相关示例。向下滚动包列表,直到转到 io.netty.example 包。在该列表中,您将找到名为io.netty.example.http.websocketx.server的包。关于如何实现websocket服务器或仅仅是处理程序,有一个相当简单且布局合理的示例。
Websocket服务器比其他服务器稍微复杂一点,因为它们必须作为HTTP服务器启动,因为协议规定必须通过"升级"来启动websockets。一个HTTP连接,但正如我所说,上面引用的例子使这一点相当清楚。
答案 1 :(得分:0)
所以,我找到了解决方案!它不符合web-socket的原生文档,但谁关心它的工作方式与我预期的一样!
public void channelRead(ChannelHandlerContext ctx, Object msg)
{
DefaultHttpRequest httpRequest = null;
if (msg instanceof DefaultHttpRequest)
{
httpRequest = (DefaultHttpRequest) msg;
// Handshake
WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory("ws://127.0.0.1:8080/", null, false);
final Channel channel = ctx.channel();
final WebSocketServerHandshaker handshaker = wsFactory.newHandshaker(httpRequest);
if (handshaker == null) {
} else {
ChannelFuture handshake = handshaker.handshake(channel, httpRequest);
}
}
}
不要忘记添加
p.addLast(new HttpRequestDecoder(4096, 8192, 8192, false));
p.addLast(new HttpResponseEncoder());
到您的管道。