赞
踩
WebSocket是一种在网络通信中的协议,它是独立于HTTP协议的。该协议基于TCP/IP协议,可以提供双向通讯并保有状态。这意味着客户端和服务器可以进行实时响应,并且这种响应是双向的。WebSocket协议端口通常是80,443。
WebSocket的出现使得浏览器具备了实时双向通信的能力。与HTTP这种非持久单向响应应答的协议相比,WebSocket是一个持久化的协议。举例来说,即使在关闭网页或者浏览器后,WebSocket的连接仍然保持,用户也可以继续接收到服务器的消息。
此外,要建立WebSocket连接,需要浏览器和服务器握手进行建立连接。一旦连接建立,WebSocket可以在浏览器和服务器之间双向发送或接受信息。总的来说,WebSocket提供了一个高效、实时的双向通信方案。
- package org.tianfan.websocket;// WebSocketServer.java
-
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelPipeline;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.channel.socket.nio.NioServerSocketChannel;
- import io.netty.handler.codec.http.HttpObjectAggregator;
- import io.netty.handler.codec.http.HttpServerCodec;
- import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-
- public class WebSocketServer {
-
- private final int port;
-
- public WebSocketServer(int port) {
- this.port = port;
- }
-
- public void run() throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- ServerBootstrap b = new ServerBootstrap();
- b.group(bossGroup, workerGroup)
- .channel(NioServerSocketChannel.class)
- .childHandler(new ChannelInitializer<SocketChannel>() {
- @Override
- public void initChannel(SocketChannel ch) throws Exception {
- ChannelPipeline p = ch.pipeline();
- p.addLast(new HttpServerCodec());
- p.addLast(new HttpObjectAggregator(65536));
- p.addLast(new WebSocketServerProtocolHandler("/websocket"));
- p.addLast(new WebSocketServerHandler());
- }
- });
-
- ChannelFuture f = b.bind(port).sync();
- f.channel().closeFuture().sync();
- } finally {
- workerGroup.shutdownGracefully();
- bossGroup.shutdownGracefully();
- }
- }
-
- public static void main(String[] args) throws Exception {
- int port = 8080;
- if (args.length > 0) {
- port = Integer.parseInt(args[0]);
- }
-
- new WebSocketServer(port).run();
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
我来解释一下上面的代码:
使用Netty框架中的WebSocketServerProtocolHandler处理器,将HTTP升级为WebSocket协议。它创建了一个新的管道(pipeline)并将WebSocket处理程序添加到管道的尾部,以便处理WebSocket协议的握手和帧。"/websocket"是WebSocket的URI路径,它指定了WebSocket服务的相对地址,该地址将在客户端请求连接时被指定。
- package org.tianfan.websocket;
-
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.SimpleChannelInboundHandler;
- import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
-
- public class WebSocketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
-
- @Override
- public void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
- // 处理消息
- System.out.println("Received message: " + msg.text());
- ctx.channel().writeAndFlush(new TextWebSocketFrame("Server received: " + msg.text()));
- }
-
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- // 添加连接
- System.out.println("Client connected: " + ctx.channel());
- }
-
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- // 断开连接
- System.out.println("Client disconnected: " + ctx.channel());
- }
-
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- // 异常处理
- cause.printStackTrace();
- ctx.close();
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
我来解释一下上面的代码:
刚信息发过来的时候,在服务端打印,并写入前端。
- <!-- index.html -->
-
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>WebSocket Test</title>
- </head>
- <body>
- <h1>WebSocket Test</h1>
- <div>
- <input type="text" id="message" placeholder="Message">
- <button onclick="send()">Send</button>
- </div>
- <div id="output"></div>
- <script>
- var socket = new WebSocket("ws://localhost:8080/websocket");
-
- socket.onopen = function(event) {
- console.log("WebSocket opened: " + event);
- };
-
- socket.onmessage = function(event) {
- console.log("WebSocket message received: " + event.data);
- var output = document.getElementById("output");
- output.innerHTML += "<p>" + event.data + "</p>";
- };
-
- socket.onclose = function(event) {
- console.log("WebSocket closed: " + event);
- };
-
- function send() {
- var message = document.getElementById("message").value;
- socket.send(message);
- }
- </script>
- </body>
- </html>
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
运行结果:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。