import ;
import ;
import 44j;
import ;
import .*;
import ;
import ;
import ;
import ;
import ;
import .Set;
import ;
@Slf4j
@Component
@ServerEndpoint("/websocket/{username}")
public class WebSocket {
/**
* 在线人数
*/
public static int onlineNumber = 0;
/**
* 以用户的姓名为key,WebSocket为对象保存起来
*/
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
/**
* 会话
*/
private Session session;
/**
* 用户名称
*/
private String username;
/**
* OnOpen 表示有浏览器链接过来的时候被调用
* OnClose 表示浏览器发出关闭请求的时候被调用
* OnMessage 表示浏览器发消息的时候被调用
* OnError 表示有错误发生,比如网络断开了等等
*/
/**
* 建立连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("username") String username, Session session) {
onlineNumber++;
("现在来连接的客户id:" + () + "用户名:" + username);
= username;
= session;
("有新连接加入! 当前在线人数" + onlineNumber);
try {
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
//先给所有人发送通知,说我上线了
Map<String, Object> map1 = new HashMap<>();
map1.put("messageType", 1);
map1.put("username", username);
sendMessageAll((map1), username);
//把自己的信息加入到map当中去
(username, this);
//给自己发一条消息:告诉自己现在都有谁在线
Map<String, Object> map2 = new HashMap<>();
map2.put("messageType", 3);
//移除掉自己
Set<String> set = ();
map2.put("onlineUsers", set);
sendMessageTo((map2), username);
} catch (IOException e) {
(username + "上线的时候通知所有人发生了错误");
}
}
@OnError
public void onError(Session session, Throwable error) {
("服务端发生了错误" + error.getMessage());
//error.printStackTrace();
}
/**
* 连接关闭
*/
@OnClose
public void onClose() {
onlineNumber--;
//(this);
(username);
try {
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
Map<String, Object> map1 = new HashMap<>();
map1.put("messageType", 2);
map1.put("onlineUsers", ());
map1.put("username", username);
sendMessageAll((map1), username);
} catch (IOException e) {
(username + "下线的时候通知所有人发生了错误");
}
("有连接关闭! 当前在线人数" + onlineNumber);
}
/**
* 收到客户端的消息
*
* @param message 消息
* @param session 会话
*/
@OnMessage
public void onMessage(String message, Session session) {
try {
("来自客户端消息:" + message + "客户端的id是:" + ());
JSONObject jsonObject = (message);
String textMessage = ("message");
String fromusername = ("username");
String tousername = ("to");
//如果不是发给所有,那么就发给某一个人
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
Map<String, Object> map1 = new HashMap<>();
map1.put("messageType", 4);
map1.put("textMessage", textMessage);
map1.put("fromusername", fromusername);
if (("All")) {
map1.put("tousername", "所有人");
sendMessageAll((map1), fromusername);
} else {
map1.put("tousername", tousername);
sendMessageTo((map1), tousername);
}
} catch (Exception e) {
("发生了错误了");
}
}
public void sendMessageTo(String message, String ToUserName) throws IOException {
for (WebSocket item : clients.values()) {
if ((ToUserName)) {
().sendText(message);
break;
}
}
}
public void sendMessageAll(String message, String FromUserName) throws IOException {
for (WebSocket item : clients.values()) {
().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineNumber;
}
}