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_915909061 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
初雪云2 小时前
UniApp 云打包拿到 IPA 后,真正的发布工作才刚开始
ios·自动化·编辑器·产品经理·iphone
Lancker4 小时前
没有 Mac 也能上架 iOS:GitHub Actions 全自动构建 + 签名 + TestFlight 送审实录
macos·ios·github
茶底世界之下4 小时前
晚霞要多暖?用 Awaking 只改色温做一次取舍
ios
酒神dnspup6 小时前
多地区网站可用性监控怎么做?DNSPup 从基线到告警的完整实战
运维·ios·云计算·iphone·dns·网络监控
福兮说19 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
茶底世界之下1 天前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
ZZH_AI项目交付1 天前
实时字幕负责快,本地录音负责不丢:一个 iOS 录音功能为什么需要两条链路
ios·ai编程
Cc.Y1 天前
Swift深度链接的极简之道
ios·cocoa·swift
AI砖家1 天前
iPhone Duo 上架新规:旧 App 怎么兼容,还能不能继续更新?
ios·cocoa·iphone·ios上架·ios上架新规