当前位置: 首页 > 知识库问答 >
问题:

网络插座:如何判断网络索克频道何时打开?

郎祯
2023-03-14

我正在编写一个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));
   } 
}

共有1个答案

笪德华
2023-03-14

您可以检查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中构建一个通知服务,我的系统可以与它交互并通知它。最大的问题是: