通过实现简单聊天室了解websocket的基础使用
2024-09-02 17:20:34
websocket基础使用
用到的依赖包
websocket的依赖
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
json-lib的依赖
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
服务端代码实现
服务端需要Servlet3.0的注解
@ServerEndpoint("/websocket/{name}") : 用于标记该类为websocket服务端类
name用于记录当前websocket是谁,用于区分连接的用户
servlet是单例对象,websocket是多里对象,因为他需要实时连接,与要知道每个连接是谁
(解释都在注释里,不多赘述)public class WebSocket {
private String name;//用于记录当前websocket是谁,用于区分连接的用户
private Session session; //webSocket中的session 链接,用于记录当前的连接 private static Map<String,WebSocket> allClients = new HashMap<>(); public Session getSession(){
//...
} public void setSession() {
//...
} /**
*
* @param name 嗲表地址参数中的name
* @param session 当前建立的链接
*/
@OnOpen //标志建立连接的注释
public void openConnection(@PathParam("name") String name,Session session){
this.name = name;
this.session = session;
allClients.put(name,this);//将name与webSocket绑定
} /**
* 当服务器接受到消息时触发
* @param message
* @param session 当前建立的链接
*/
@OnMessage //用于接收客户端发来的消息,这个地方应该根据自己的实际业务需求,来决定到底写什么
public void onMessage(Session session,String message) {
//1.首先解析发过来的内容,找到目标接收者:通过名字找到名字对应的websocket对象,获取websocket对象中的session,创建一个固定容器用于存放对应key-value值:String-WebSocket
JSONObject jsonObject JSONObject.fromObject(message); //与前端约定,接收者为toUser,发送信息内容为toMessage
String to = jsonObject.getString("toUser");//找到接收者
String toMessage = jsonObject.getString("toMessage");//获取到发送的内容
//2.根据目标接收者,找到它的session链接
WebSocket webSocket = allClients.get(to);//获取到目标接收者的webSocket
//3.通过session发消息
if(WebSocket != null){
Session toSession = webSocket.getSession();//获取到服务器和目标接收者的链接
if(toSession.isOpen()) {
//toSession为要发送的目标者,getAsyncRemote获得链接的相对的另一端
toSession.getAsyncRemote().sendText(toMessage);
}
}else {
//正常来说应该缓存这个消息,这里我就直接发送留言,对方不在线
session.getAsyncRemote().sendText("对方不在线");
} } /**
* 当服务器发生异常时触发
* @param e 可抛出的异常
* @param session 哪个链接出现了异常
*/
@OnError
public void onError(Session session,Throwable e) { } /**
* 当链接关闭的时候触发
* @param e 可抛出的异常
* @param session 哪个链接出现了异常
*/
@OnClose
public void onClose(Session session){ } }
客户端js代码
var websocket = null; //-------------===客户端获取websocekt链接===-----------------
function connection(){
var username="";//对应服务端的name TODO:更具具体情况获得一个username用于表示当前的链接
//首先判断当前浏览器是否支持websocket
if('WebSocket' in window) {
//创建websocket
websocket = new WebSocket("ws://"+document.location.host+"/websocket"+username);
}else{
alert('当前浏览器不支持websocket');
} //建立链接的回调
websocket.onopen = function() {
console.log("链接建立了")
} //收到消息时
websocket.onmessage = function(event) {
//获得消息,并打印
console.log(event.data)
} websocket.onerror = function() {
console.log("出现异常了")
} websocket.onclose = function() {
console.log("链接关闭了")
} //当浏览器的页面窗口关闭的时候,此时应该关闭链接,防止服务器出现异常
window.onbeforeunload = = function() {
if (websocket!=null){
websocket.close();
}
}
} //------------==发送消息==-----------
function sendMessage(){
//1.获取到发送给谁
var toUser = "";//Dom操作,此处省略了
//2.获取到发送的内容
var toMessage = ""//Dom操作,此处省略了 if(websocket!=null) {
//拼json串
var message = "{'toUser':"+toUser+","+"'toMessage':"+toMessage+"}";】
//发送json串
websocket.send(message);
}
}
最新文章
- mysql 大表拆分成csv导出
- mysql高并发和表类型
- Spring的通知(Advice)
- 后端码农谈前端(CSS篇)第四课:选择器补充(伪类与伪元素)
- Android Animation学习(四) ApiDemos解析:多属性动画
- 第三章 Js变量的作用域和匿名函数
- OC面向对象封装
- matlab fscanf用法
- TimerTask实现定期检查数据库操作
- Node.js服务端框架谁才是你的真爱
- Java中栈的应用,括号匹配
- [Java Web学习]Tomcat启动时报war exploded: Error during artifact deployment
- Exception in thread ";main"; java.lang.UnsupportedClassVersionError: org/apache/ma ven/cli/Maven
- codeforces278A
- AWT和Swing的关系
- Linux基础命令---修改用户密码
- PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
- 代码实现Android5.0的下拉刷新效果
- elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(一)初始化任务并定时执行
- iOS开发-UIWebView加载本地和网络数据