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传结构化数据,或者搞个分布式会话管理,应对多服务器场景。有同样需求的朋友可以参考这个思路,具体代码根据项目调整就行。

相关推荐
90后的晨仔17 小时前
你的 iOS 最低部署版本即将不再被 App Store 接受
ios
2601_9657984720 小时前
Launch Your Wellness App Fast: The Truth About Meditation Source Code
前端·macos·ios·objective-c·cocoa
初级代码游戏1 天前
iOS开发 Swift 速记7:结构体和类
开发语言·ios·swift
Anhty2 天前
手机端叮咚变声器2026实测:功能表现、优缺点完整解析
功能测试·ios·智能手机·安卓
SameX2 天前
后台定位耗电的问题,我花两年把它压到了3%-5%
ios
星辰即远方2 天前
计算器仿写总结
学习·ui·ios·cocoa·xcode
游戏开发爱好者82 天前
系统状态:专为iPhone和iPad设计的实时系统性能监控工具全面介绍
android·ios·小程序·uni-app·iphone·webview·ipad
2501_915909063 天前
全面解析iOS应用上架到App Store的完整流程与关键注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张3 天前
抓包鹰 电脑本机网络连接表怎么看?哪些程序在联网 进程归属与可疑 IP 追溯
网络协议·计算机网络·网络安全·ios·adb·https·udp
2501_915918413 天前
免 Xcode 开发 iOS,工具链替代方案与编译、签名、安装
ide·vscode·macos·ios·个人开发·xcode·敏捷流程