美文网首页
5.使用Netty完成WebSocket

5.使用Netty完成WebSocket

作者: 未知的证明 | 来源:发表于2019-02-22 15:11 被阅读0次

    运行后主要截图如下:

    网页截图
    控制台输出

    1.网页端代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>WebSocket客户端</title>
    </head>
    <body>
    <script type="text/javascript">
        var socket;
        if(window.WebSocket) {
            socket = new WebSocket("ws://localhost:8899/ws");
    
            socket.onmessage = function(event) {
                var ta = document.getElementById("responseText");
                ta.value = ta.value + "\n" + event.data;
            }
    
            socket.onopen = function(event) {
                var ta = document.getElementById("responseText");
                ta.value = "连接开启!";
            }
    
            socket.onclose = function(event) {
                var ta = document.getElementById("responseText");
                ta.value = ta.value + "\n" + "连接关闭!";
            }
        } else {
            alert('浏览器不支持WebSocket!')
        }
    
        function send(message) {
            if(!window.WebSocket) {
                return;
            }
    
            if(socket.readyState == WebSocket.OPEN) {
                socket.send(message);
            } else {
                alert("连接尚未开启!");
            }
        }
    </script>
    <form onsubmit="return false;">
        <textarea name="message" style="width: 400px; height: 200px"></textarea>
        <input type="button" value="发送数据" onclick="send(this.form.message.value)">
        <h3>服务端输出:</h3>
        <textarea id="responseText" style="width: 400px; height: 300px;"></textarea>
        <input type="button" onclick="javascript: document.getElementById('responseText').value=''" value="清空内容">
    </form>
    </body>
    </html>
    

    2.Netty服务端主程序

    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    import io.netty.handler.logging.LogLevel;
    import io.netty.handler.logging.LoggingHandler;
    import java.net.InetSocketAddress;
    public class MyServer {
        public static void main(String[] args) throws InterruptedException {
            NioEventLoopGroup bossGroup = new NioEventLoopGroup();
            NioEventLoopGroup workGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class)
                        .handler(new LoggingHandler(LogLevel.INFO))
                        .childHandler(new WebSocketChannelInitializer());
                ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress(8899)).sync();
                channelFuture.channel().closeFuture().sync();
            } finally {
                bossGroup.shutdownGracefully();
                workGroup.shutdownGracefully();
            }
    
        }
    }
    

    3.Netty服务端的Initializer程序

    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.handler.codec.http.HttpObjectAggregator;
    import io.netty.handler.codec.http.HttpServerCodec;
    import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
    import io.netty.handler.stream.ChunkedWriteHandler;
    public class WebSocketChannelInitializer extends ChannelInitializer<SocketChannel> {
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            pipeline.addLast(new HttpServerCodec());
            pipeline.addLast(new ChunkedWriteHandler());
            pipeline.addLast(new HttpObjectAggregator(8192));
            pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
            pipeline.addLast(new TextWebSocketFrameHandler());
        }
    }
    

    4.Netty服务端Handler

    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
    import java.time.LocalDateTime;
    public class TextWebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
            System.out.println("【收到消息】:" + msg.text());
            ctx.writeAndFlush(new TextWebSocketFrame("服务器时间:" + LocalDateTime.now()));
        }
        @Override
        public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
            System.out.println("Handler Added:" + ctx.channel().id().asLongText());
        }
        @Override
        public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
            System.out.println("Handler Removed:" + ctx.channel().id().asLongText());
        }
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            System.out.println("异常发生");
            ctx.close();
        }
    }
    

    相关文章

      网友评论

          本文标题:5.使用Netty完成WebSocket

          本文链接:https://www.haomeiwen.com/subject/umjeyqtx.html