WebSocket介绍及部署

WebSocket是一种在单个TCP连接上进行全双工通信的协议,其设计的目的是在Web浏览器和Web服务器之间进行实时通信(实时Web)。

WebSocket协议的优点包括:

  1. 更高效的网络利用率:与HTTP相比,WebSocket的握手只需要一次,之后客户端和服务器端可以直接交换数据;

  2. 实时性更高:WebSocket的双向通信能够实现实时通信,无需等待客户端或服务器端的响应;

  3. 更少的通信量和延迟:WebSocket可以发送二进制数据,而HTTP只能发送文本数据,并且WebSocket的消息头比HTTP更小。

简单使用示例:

  1. 客户端JavaScript代码:

    javascript 复制代码
    //创建WebSocket对象
    var socket = new WebSocket("ws://localhost:8080/");
    
    //建立连接后回调函数
    socket.onopen = function(event) {
        console.log("WebSocket连接建立成功");
    };
    
    //接收到消息后回调函数
    socket.onmessage = function(event) {
        console.log("接收到消息:" + event.data);
    };
    
    //错误回调函数
    socket.onerror = function(event) {
        console.log("WebSocket连接发生错误");
    };
    
    //关闭回调函数
    socket.onclose = function(event) {
        console.log("WebSocket连接关闭");
    };
    
    //发送消息
    socket.send("hello server");
  2. 服务器端Java代码:

    java 复制代码
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashSet;
    import java.util.Set;
    
    public class WebSocketServer {
    
        //存储所有连接到服务器的WebSocket对象
        private static Set<WebSocket> webSockets = new HashSet<>();
    
        public static void main(String[] args) throws IOException {
            //创建ServerSocket
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("服务器已启动,监听端口:8080");
    
            //循环等待客户端连接
            while (true) {
                //创建Socket对象
                Socket socket = serverSocket.accept();
    
                //创建WebSocket对象,存储到集合中
                WebSocket webSocket = new WebSocket(socket);
                webSockets.add(webSocket);
    
                //启动线程,处理该WebSocket连接
                new Thread(webSocket).start();
                System.out.println("客户端已连接:" + socket.getInetAddress().getHostAddress());
            }
        }
    
        //广播消息给所有连接到服务器的WebSocket对象
        public static void broadcast(String message) {
            for (WebSocket webSocket : webSockets) {
                try {
                    webSocket.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  3. 服务器端WebSocket代码:

    java 复制代码
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
    
    public class WebSocket implements Runnable {
    
        private Socket socket;
        private InputStream inputStream;
    
        public WebSocket(Socket socket) throws IOException {
            this.socket = socket;
            this.inputStream = socket.getInputStream();
        }
    
        //接收消息
        public String receiveMessage() throws IOException {
            byte[] buffer = new byte[1024];
            int len = inputStream.read(buffer);
            return new String(buffer, 0, len);
        }
    
        //发送消息
        public void sendMessage(String message) throws IOException {
            socket.getOutputStream().write(message.getBytes());
        }
    
        @Override
        public void run() {
            try {
                while (true) {
                    String message = receiveMessage();
                    System.out.println("接收到消息:" + message);
                    WebSocketServer.broadcast(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
相关推荐
Xiu Yan6 分钟前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖14 分钟前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理15 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
木头科技22 分钟前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
深盾科技_Virbox24 分钟前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
thefool11226625 分钟前
多线程 3
java
CoderYanger31 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
liangbo71 小时前
01-Java 集合框架全景:从 Collection 到 Map 一张关系网理清
java
xuxigifxfh1 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo71 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具