上一篇中构建了webSocket的基本结构,如何链接如何发送如何关闭。这些功能都只能满足最基本的需求,基本上实现的老师创建房间,学生加入房间并在房间内交流。对于老师端而言通过查找他所教的班级,然后选择要上课的班就可以开设在线课堂了,但是对学生而言必须要知道当前上课老师的房间号才可以进入,而且老师和班级时多对多,学生很难知道到底是那个老师在给他们上课,或者说这个老师有没给他们上课。所以需要这么一个功能,学生能够看到当前他所在班级的在线课堂。
首先在WebSocketRoom类中加入静态变量classMessage用于存储当前的所有的在线课堂信息,里面包括开课的老师房间号,班级号等等其他的信息。
public static Map<String,String> classMessage = new ConcurrentHashMap();//存储班级信息
这些信息都以json字符串的形式存储在了classMessage中。这样方便前台接收转换。同时也可以让一个map存储跟多的信息
String classMessage="{roomId:"+roomId+","+"classId:"+classId+","+"sort:"+sort+"}";
接下来需要进行数据交互,为了方便管理我们这里在创建一个webSocket服务类
@Slf4j
@Service
@Component
@ServerEndpoint("/webSocketRoom/{account}")
@DependsOn("springContextUtils")
public class WebSocketClassServiceImpl {
/** 记录当前在线连接数 */
// private static AtomicInteger onlineCount = new AtomicInteger(0);
private Session session;
@OnOpen
public void onOpen(Session session) throws IOException {
Map<String, String> classTeacehr=WebSocketRoom.classMessage;//获取当前房间的信息
ArrayList<String> classMessage = new ArrayList<String> ();
for (String account : classTeacehr.keySet()) {
String message = classTeacehr.get(account);
classMessage.add(message);
}
log.info("向{}发送了{}",session,classMessage.toString());
session.getAsyncRemote().sendText( classMessage.toString());
}
@OnClose
public void onClose(Session session,@PathParam("account") String account) throws IOException {
}
@OnError
public void onError(Throwable t) throws Throwable {
log.error("webScoketRoom报错: " + t.toString());
}
@OnMessage
public void onMessage(@PathParam("roomId") String roomId,@PathParam("account") String account,String message){
}
}
这里可以看到在链接建立的时候我们会遍历当前的在线课堂信息并存储到ArrayList数组中,这里采用ArrayList的理由很简单,灵活度高,而且有自动扩容。之后调用toString方法就将数据变成了json字符串然后发送至前台,前台在对字符串进行处理,查找到里面有学生所在班级的房间信息并渲染出来,之后学生只需要点击班级就可以直接加入房间了
ArrayList<String> classMessage = new ArrayList<String> ();
for (String account : classTeacehr.keySet()) {
String message = classTeacehr.get(account);
classMessage.add(message);
}
log.info("向{}发送了{}",session,classMessage.toString());
session.getAsyncRemote().sendText( classMessage.toString());