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

相关推荐
敲代码的鱼12 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹14 小时前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
时光足迹15 小时前
JPush UniApp UTS 插件完全参考手册:API、事件与厂商通道一网打尽
vue.js·ios·uni-app
时光足迹15 小时前
极光推送全攻略(下):uni-app 代码实现与 iOS 排查实战
vue.js·ios·uni-app
时光足迹16 小时前
极光推送全攻略(上):被iOS证书折磨了三天,我写了一份前端也能看懂的避坑指南
前端·ios·uni-app
编程范式2 天前
SwiftUI 中图片如何适配可用空间
ios
songgeb4 天前
启发式 UI 自动化:从线性剧本到每步读屏决策
ios·测试
壹方秘境8 天前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
初级代码游戏13 天前
easy Photo Clean公测版:快速清理iPhone照片 邀请公测
ios·iphone
库奇噜啦呼13 天前
【iOS】RunLoop学习
学习·ios