本文地址:https://blog.csdn.net/qq_40785165/article/details/121622651,转载需附上此链接
坚持就是胜利
大家好,我是小黑,一个还没秃头的程序员~~~
本期写点服务端的内容,介绍一下大学时期经常用到的Servlet是如何实现WebSocket连接与通信的,编写Servlet不需要搭建复杂的框架,沿用大学期间学习的Web项目经验即可,适用于大学生开发毕业设计或者课程作业等场景。
话不多说,直接开始:
条件:
- 需要Java-WebSocket-1.3.5.jar文件
链接:https://pan.baidu.com/s/1klmTVfjaqOBrCVRqsPbGNQ
提取码:ijqw
- 需要Tomcat8.0及以上
代码如下:
package websocket;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/websocket/{name}")
public class WebSocket {
/**
* 与某个客户端的连接对话,需要通过它来给客户端发送消息
*/
private Session session;
/**
* 用于存所有的连接服务的客户端,这个对象存储是安全的
*/
public static ConcurrentHashMap<String, WebSocket> webSocketSet = new ConcurrentHashMap<String, WebSocket>();
/**
* 标识当前连接客户端的用户名
*/
private String name;
public String getName() {
return name;
}
/**
* @param session
* @param name 可以试着用uId
*/
@OnOpen
public void OnOpen(Session session, @PathParam(value = "name") String name) {
this.session = session;
System.out.println(session.getId()+","+name);
this.name = name;
// name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
webSocketSet.put(name, this);
System.out.println("[WebSocket] 连接成功,当前连接人数为:="+ webSocketSet.size()+name);
}
@OnClose
public void OnClose() {
webSocketSet.remove(this.name);
System.out.println("[WebSocket] 退出成功,当前连接人数为:="+webSocketSet.size()+webSocketSet.toString());
}
@OnMessage
public void OnMessage(String message) {
System.out.println("[WebSocket] 收到消息:{}"+ message);;
try {
sendMessage("接收的消息:"+message);
} catch (IOException e) {
e.printStackTrace();
}
}
@OnError
public void onError(Throwable error) {
System.out.println("[WebSocket] 发生错误:"+ error.toString());
}
/**
* 群发
*
* @param message
*/
public void GroupSending(String message) {
for (String name : webSocketSet.keySet()) {
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 指定发送
*
* @param name
* @param message
*/
public static void appointSending(String name, String message) {
System.out.println(name);
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static ConcurrentHashMap<String, WebSocket> getWebSocketSet() {
return webSocketSet;
}
public void sendMessage(String message) throws IOException {
System.out.println("消息===="+message);
this.session.getBasicRemote().sendText(message);
}
}
由于只是一次开发的记录,就不一一详解了,大家直接拿起来使用就行了,后面有机会我会继续分享关于服务端的开发学习过程的,大家晚安!