JavaWebSocket案例

WebSocket本质上是个全双工通信协议,跟HTTP那种"一问一答"的模式不同,它能在客户端和服务器之间建立持久连接,数据想发就发,特别适合实时应用。Java里可以用javax.websocket包来搞,下面我通过一个简单的聊天室案例来演示具体用法。这个案例分服务器和网页客户端两部分,服务器用Tomcat跑,客户端用HTML+JavaScript写。

先来看服务器端的代码。新建一个Java类叫ChatEndpoint,继承javax.websocket.Endpoint,并加上@ServerEndpoint注解,指定访问路径为"/chat"。这里重写onOpen方法处理连接建立,用session.getBasicRemote().sendText()给客户端发条欢迎消息。接着在onMessage方法里处理收到的消息,这里简单实现了个广播功能:任何客户端发来的消息,都会转发给所有连接的会话。注意要用synchronized避免并发问题,毕竟多个线程可能同时操作会话集合。最后在onClose和onError方法里清理资源和打印日志,确保连接关闭时不会内存泄漏。

部署时记得在web.xml里配置WebSocket支持,或者如果用Spring Boot的话,加个@EnableWebSocket注解就行。我这边直接用的Tomcat 10,内置了WebSocket实现,不用额外引包。

客户端部分写个HTML页面,用JavaScript的WebSocket对象连接服务器。代码里先new WebSocket("ws://localhost:8080/项目名/chat"),注意协议是ws不是http。监听onopen事件显示连接状态,onmessage事件把服务器推送的消息追加到页面div里。还有个输入框和按钮,点击按钮时调用socket.send()发消息给服务器。记得在onclose和onerror里处理异常,比如提示用户重连。

测试的时候,先启动Tomcat,再在浏览器打开这个HTML页面。多开几个标签页模拟多个用户,输入消息能看到实时广播效果。我试了下,延迟基本感觉不到,比轮询强多了。不过要注意,WebSocket连接可能被防火墙拦截,生产环境最好配WSS加密。

踩坑记录:一开始没加synchronized,偶尔会报并发修改异常。后来查文档才发现Session不是线程安全的。另外,如果用Nginx反向代理,记得配置proxy_set_header Upgrade和Connection头,否则WebSocket握手会失败。

总的来说,Java WebSocket用起来挺顺手,代码量不大,性能提升明显。下次可以试试结合JSON传结构化数据,或者搞个分布式会话管理,应对多服务器场景。有同样需求的朋友可以参考这个思路,具体代码根据项目调整就行。

相关推荐
2501_915918411 小时前
如何解析iOS崩溃日志:从获取到符号化分析
android·ios·小程序·https·uni-app·iphone·webview
ajassi20004 小时前
开源 Objective-C IOS 应用开发(二十一)自定义控件--示波器
ios·开源·objective-c
ajassi20004 小时前
开源 Objective-C IOS 应用开发(二十)多线程处理
ios·开源·objective-c
00后程序员张16 小时前
Swift 应用加密工具的全面方案,从源码混淆到 IPA 成品加固的多层安全实践
安全·ios·小程序·uni-app·ssh·iphone·swift
2501_9160088919 小时前
提高 iOS 应用逆向难度的工程实践,多工具联动的全栈安全方案
android·安全·ios·小程序·uni-app·cocoa·iphone
2501_915909061 天前
iOS App 测试工具全景指南,构建从开发、性能到系统级调试的多工具协同测试体系
android·测试工具·ios·小程序·uni-app·iphone·webview
AskHarries1 天前
RevenueCat 接入 Apple App Store 订阅全流程详解(2025 最新)
flutter·ios·app
ajassi20001 天前
开源 Objective-C IOS 应用开发(十三)通讯--Http访问
ios·开源·objective-c
游戏开发爱好者81 天前
Fiddler抓包工具完整教程 HTTPHTTPS抓包、代理配置与API调试实战技巧(开发者进阶指南)
前端·测试工具·ios·小程序·fiddler·uni-app·webview