Java 用于流媒体服务器的Netty 4.x.x WebSocket握手
我有一个来自官方Netty的Echo服务器示例 如何从websocket添加连接和流媒体功能 以下是我的ServerHandler代码:Java 用于流媒体服务器的Netty 4.x.x WebSocket握手,java,websocket,netty,Java,Websocket,Netty,我有一个来自官方Netty的Echo服务器示例 如何从websocket添加连接和流媒体功能 以下是我的ServerHandler代码: public class ServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { super.channe
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握手期间出错:无效状态行Netty服务器不会自动处理所有协议,因此您需要添加对WebSocket的支持 我发现最好的开始是检查Netty页面中的相关示例。向下滚动程序包列表,直到到达io.netty.example程序包。在该列表中,您将找到一个名为的包。关于如何实现websocket服务器或只是处理程序,有一个非常简单且布局良好的示例
Websocket服务器比其他服务器稍微复杂一些,因为它们必须作为HTTP服务器开始使用,因为协议规定必须通过“升级”HTTP连接来启动Websocket,但正如我所说的,上面引用的示例非常清楚地说明了这一点 所以,我找到了解决办法!它不符合web套接字的本机文档,但谁在乎它能像我预期的那样工作呢
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());
到你的管道