




引言


在实时通信的需求日益增加的今天,WebSocket作为一种新兴的网络协议,成为了开发者们的热门选择。
本文将带你了解WebSocket的背景、原理以及如何用它快速搭建一个简单的聊天室。


WebSocket 的起源




WebSocket 概述




WebSocket 的优缺点




WebSocket 的适用场景




浏览器对 WebSocket 的支持




WebSocket 的通信原理
#01-连接建立




WebSocket协议依赖于TCP协议,通过HTTP/1.1的101状态码实现连接握手。客户端向服务器发送一个 HTTP GET请求,请求的路径为WebSocket地址,并附带特殊的头字段以指示希望升级到WebSocket协 议。服务器在响应时返回HTTP 101状态码,表示协议切换成功。

#02-数据传输




WebSocket的消息可以分为多个数据帧进行传输。发送方将消息切割成若干帧并发送,接收方再将这些 帧组装回完整的消息。

#03-连接维持与关闭





#04-实现简易聊天室





#05-前端代码


<html lang="en"><head><meta charset="UTF-8"><title>WebSocket 聊天室</title></head><body><div id="chat"></div><input type="text" id="messageInput" placeholder="输入您的消息"><button onclick="sendMessage()">发送</button><script>// 创建 WebSocket 连接const socket = new WebSocket('ws://localhost:8888');// 当连接打开时的事件处理socket.onopen = (event) => {console.log('WebSocket 连接已打开:', event);};// 接收到消息时的事件处理socket.onmessage = (event) => {const messageDiv = document.getElementById('chat');const messageParagraph = document.createElement('p');messageParagraph.textContent = event.data; // 显示接收到的消息messageDiv.appendChild(messageParagraph);};// 当连接关闭时的事件处理socket.onclose = (event) => {console.log('WebSocket 连接已关闭:', event);};// 发送消息的函数function sendMessage() {const messageInput = document.getElementById('messageInput');const message = messageInput.value; // 获取输入框中的消息socket.send(message); // 发送消息messageInput.value = ''; // 清空输入框}</script></body></html>
#06-后端代码(Java)


package itfdz;import org.java_websocket.WebSocket;import org.java_websocket.handshake.ClientHandshake;import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;public class ChatServer extends WebSocketServer {{public ChatServer(int port) {super(new InetSocketAddress(port)); // 初始化服务器,绑定端口}// 新连接时的处理public void onOpen(WebSocket conn, ClientHandshake handshake) {System.out.println("新连接来自: " +conn.getRemoteSocketAddress().getAddress().getHostAddress());}// 连接关闭时的处理public void onClose(WebSocket conn, int code, String reason, boolean remote)System.out.println("关闭连接: " +conn.getRemoteSocketAddress().getAddress().getHostAddress());}// 接收到消息时的处理public void onMessage(WebSocket conn, String message) {System.out.println("收到消息: " + message);broadcast(message); // 广播消息到所有连接的客户端}// 发生错误时的处理public void onError(WebSocket conn, Exception ex) {System.err.println("连接错误: " + ex.getMessage());}// 服务器启动时的处理public void onStart() {System.out.println("WebSocket 服务器已启动");}}public static void main(String[] args) {int port = 8888; // 设定端口号ChatServer server = new ChatServer(port); // 创建服务器实例server.start(); // 启动服务器System.out.println("WebSocket 服务器在端口 " + port + " 上运行");}
#07-效果如图所示





总结




个人简介



原文作者:IT枫斗者;如有侵权,请联系管理员删除。