WebSocket简介 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。
聊天室的实现 最近在项目中要实现一个聊天功能,所以就想到了使用WebSocket,此聊天室是类似QQ聊天形式,有头像加文字,自己发送的消息和别人的消息可以很明显区分。下载javax.websocket.jar,使用注解方式实现了一个简单的多房间聊天demo,通过打开多个index.html页面,输入相同的房间名,进入房间后可以相互通信,不同房间不能互相通信,不同用户通过websocket的session自己分配的id来区分,自己的头像和别人的头像使用两张图片区分,实际开发可以使用用户名和用户的头像来区分。连接到服务器的url中,roomName是一个路径参数,即在index.html中获取到房间名。多房间的原理其实就是把多个用(session)放在roomName对应的set集合中,每次广播信息只在房间名对应的set集合中广播,实现房间聊天信息的隔离。
服务器端代码
@ServerEndpoint("/webSocket/chat/{roomName}")
public class WsServer {// 使用map来收集session,key为roomName,value为同一个房间的用户集合
// concurrentMap的key不存在时报错,不是返回null
private static final Map> rooms = new ConcurrentHashMap();
@OnOpen
public void connect(@PathParam("roomName") String roomName, Session session) throws Exception {
// 将session按照房间名来存储,将各个房间的用户隔离
if (!rooms.containsKey(roomName)) {
// 创建房间不存在时,创建房间
Set room = new HashSet<>();
// 添加用户
room.add(session);
rooms.put(roomName, room);
} else {
// 房间已存在,直接添加用户到相应的房间
rooms.get(roomName).add(session);
}
System.out.println("a client has connected!");
}@OnClose
public void disConnect(@PathParam("roomName") String roomName, Session session) {
rooms.get(roomName).remove(session);
System.out.println("a client has disconnected!");
}@OnMessage
public void receiveMsg(@PathParam("roomName") String roomName,
String msg, Session session) throws Exception {//创建时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date =new Date();
String time = simpleDateFormat.format(date);
String message;
//可以在此保存数据到数据库for (Session session1 : rooms.get(roomName)) {
//判断是否发送给自己
if(session1.equals(session)) {
//发送给自己
message = "
文章图片
文章图片
【WebSocket实现多房间聊天室】源码下载:https://github.com/shikuLi/ChatRoom
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- websocket|android中如何使用websocket,以及用nodejs做后台的实例
- WebSocket安卓客户端实现详解(一)--连接建立与重连
- WebSocket断线重连
- webSocket断线重连(不需要心跳 ,纯前端 无需后端 超级简单)
- websocket|go websocket 群组聊天+基于数据大屏推送技术
- PHP|初次使用swoole遇到的问题
- java|springboot-websocket 实现