如何在同一服务器中将netty用作WebSocket服务器和HTTP客户端

时间:2016-04-14 10:30:39

标签: netty

我使用Netty作为简单的websocket服务器,我希望netty能够通信 使用HTTP作为客户端的第二个netty服务器。 怎么办呢?
现在我的初始化程序看起来像这样:

public class PDServerInitializer extends ChannelInitializer<Channel> {
     private final ChannelGroup group;

        public PDServerInitializer(ChannelGroup group) {
            this.group = group;
        }

        protected void initChannel(Channel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            pipeline.addLast(new HttpServerCodec());
            pipeline.addLast(new HttpObjectAggregator(64 * 1024));
            pipeline.addLast(new ChunkedWriteHandler());
            pipeline.addLast(new HttpRequestHandler("/ws"));
            pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
            pipeline.addLast(new TextWebSocketFrameHandler(group));
        }
}



public class TextWebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    private final ChannelGroup group;

    public TextWebSocketFrameHandler(ChannelGroup group) {
        this.group = group;
    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {

            ctx.pipeline().remove(HttpRequestHandler.class);



            group.add(ctx.channel());
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }

    @Override
    public void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        msg.retain();
        TextWebSocketFrame frame = (TextWebSocketFrame) msg;
        String jsonRequest = frame.text(); 

       //I WAHT TO SENT THE STRING jsonRequest to NETTY Server 2 as client from here 

    }
}

服务器端工作得很好我想发送String&#34; jsonRequest&#34;将第二个netty作为http请求并从此特定服务器接收答案

1 个答案:

答案 0 :(得分:0)

Http和WebSocket是不同的协议。 WebSocket所做的是使用HTTP请求来升级它从HTTP到WebSocket的连接。在握手后,netty不会理解HTTP调用,而是了解WebSocket帧。

但恕我直言,如果您使用的是WebSocket,则不必使用任何其他协议来实现两个对等体之间的来回通信。因为WebSocket通道是全双工通道,这意味着您可以使用客户端和服务器之间的相同连接来发送或接收来自另一端的消息。

您必须了解的是,WebSocket服务器和客户端之间只有一点点不同。客户端始终是发起连接的人。但那就是它。之后,双方都可以收听频道并将WebSocket帧写入频道。所以我想将连接启动器作为客户端来解决您的问题。
为您的客户尝试Netty WebSocket client example我认为应该适用于您的方案。