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

相关推荐
for_ever_love__3 分钟前
UI学习:单例传值
学习·ui·ios·objective-c
for_ever_love__8 分钟前
UI学习:通知传值
学习·ui·ios·objective-c
2501_915106321 小时前
在Mac上搭建iOS开发环境的详细步骤与注意事项
ide·vscode·macos·ios·个人开发·swift·敏捷流程
想个名字想老半天1 小时前
uni 离线打包 ios,适用于自定义 ios系统最低适配 保姆级教程
macos·ios·cocoa
No Silver Bullet1 小时前
iOS开发进阶(二十四):一文读懂iOS发布证书,描述文件到期后,在工程中如何进行替换
ios
库奇噜啦呼1 小时前
【iOS】源码学习-类与对象底层原理
学习·ios·cocoa
harder32114 小时前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式
for_ever_love__18 小时前
UI学习:UITableView的基本操作及折叠cell
学习·ui·ios
SameX20 小时前
做了一个健康记录 App,聊聊 SwiftData + 拨轮交互的实现思路
ios
诸葛亮的芭蕉扇1 天前
iOS视频自动全屏问题解决方案
ios·音视频