我正在编写一个netty/websocket服务器应用程序,其中对websockent客户端(例如浏览器)的写入来自另一个线程(即不是来自websockets)。
这是netty4.0.18.Final,我的应用程序在很大程度上基于提供的websocket服务器示例。
我需要知道websocket通道何时打开,以便我可以保存ChannelHandlerContext,以便其他线程可以执行写入。我有一些有效的方法,但我希望有一个更健壮的方法。
它看起来像WebSocketServerHandler。当浏览器连接到Web套接字时,将调用channelRead0()两次。第二个调用的ChannelHandlerContext可用于将来写入通道。
所以我的方法是对channelRead0()的第二次调用采取一些行动。如果我在handleWebSocketFrame()中得到一个CloseWebSocketFrame,我将重置计数器。
有更好的方法吗?
更新:添加userEventTriggered()后,处理程序类如下所示:
public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> {
...
@Override
public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("read0");
if (msg instanceof FullHttpRequest) {
handleHttpRequest(ctx, (FullHttpRequest) msg);
} else if (msg instanceof WebSocketFrame) {
handleWebSocketFrame(ctx, (WebSocketFrame) msg);
}
}
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
System.out.println("userEvent");
if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {
System.out.println("opening channel " + ctx.toString());
...
} else {
super.userEventTriggered(ctx, evt);
}
}
和初始值设定项:
public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
...
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("codec-http", new HttpServerCodec());
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
pipeline.addLast("handler", new WebSocketServerHandler(statusListener));
}
}
您可以检查ServerHandshakeStateEvent。HANDSHAKE_COMPLETE
事件类似于我的聊天服务器示例中的事件,它可以如下使用:
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {
ctx.pipeline().remove(HttpRequestHandler.class);
group.writeAndFlush(new TextWebSocketFrame("Client " + ctx.channel() + " joined"));
group.add(ctx.channel());
} else {
super.userEventTriggered(ctx, evt);
}
}
我正在使用lemmingzshadow(web)的PHP Websocket服务器。直到现在一切都很顺利。 更新到chrome 20后,如果我想与服务器握手,它以以下错误结束 来自chrome 20的标题 返回的标题: 我认为问题在于Chrome20的“Sec WebSocket Extensions:x-webkit-deflate-frame”标题。 你知道如何让它重新工作吗?
在Netty 4.0.0.CR9中,Channel.id()已被删除。 现在我如何获得频道的ID? 我曾经在我的所有处理程序(例如System.out.println(ctx.channel())中使用id()进行日志记录。id()-readable bytes():" in . readable bytes()))。 我不能依赖通道的toString方法,因为它可能会被覆盖。
本文向大家介绍Android网络判断知识小结,包括了Android网络判断知识小结的使用技巧和注意事项,需要的朋友参考一下 Android中判断当前网络是否可用 应用场景:实现判断当前网络是否可用 当前有可用网络,如下图: 当前没有可用网络,如下图: 实现步骤: 1、获取ConnectivityManager对象 2、获取NetworkInfo对象 3、判断当前网络状态是否为连接状态 4、在And
Kubernetes网络模型 IP-per-Pod,每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间 集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问 所有容器之间无需NAT就可以直接互相访问 所有Node和所有容器之间无需NAT就可以直接互相访问 容器自己看到的IP跟其他容器看到的一样 Service cluster IP尽可在集群内部访问,外部请求需要通过
本文向大家介绍iOS判断网络请求超时的方法,包括了iOS判断网络请求超时的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍了iOS判断网络请求超时的方法,代码具体如下: 打印 error 可见: po error.localizedDescription 请求超时。 po error.code -1001 所以使用 error.code是否等于 -1001 判断请求超时 以上就是
我是enterprise social network product的开发人员,我正在开发一个非常类似于Facebook通知的功能。我们想为我们的客户提供一个实时的通知机制。 我正在Node.js中构建一个通知服务,我的系统可以与它交互并通知它。最大的问题是: