赞
踩
问题描述:当客户端发送请求建立连接以后,服务器会采用一种数据结构来维护这个连接,具体体现就是每次连接,服务器就会产生一个Session,这个Session可以唯一标识这个通道,发数据的时候会把指定的数据放到特定的通道里面去。那么并发情况下,如何实现呢?
从开始一个最简单的webSocket实例跑通了以后就慢慢考虑并发的问题,策略换了好几种,不过都是大家讨论后的结果,由于水平有限不一定是最优的方案。
服务器端通过继承父类的handleTextMessage方法来处理产生的session和从客户端传过来的参数。关于采用什么样的数据结构来存储session和message讨论出来了很多方案。
- protected void handleTextMessage(WebSocketSession session,
- TextMessage message) throws Exception {
- super.handleTextMessage(session, message);
- }
发送消息的时候需要把参数转化成TextMessage类型,然后调用通道的sendMessage方法,如下:
- public void sendMessage(String request) throws IOException {
- TextMessage returnMessage = new TextMessage(request);
- session.sendMessage(returnMessage);
- }
- }
那么并发情况下,由于是多个客户端连接,需要建立多个通道,通道可以在handleTextMessage的方法里面采用一种数据结构收集起来,然后在sendMessage方法中指定通道然后发送对应的消息。在前一篇文章中提到我们项目中已经做好了一套通信机制:终端发过来的数据通过NIOServer转发到activeMQ中,也就是说所有的消息可以通过activeMQ的出口得到,那么这里就是一种观察者模式的使用了,也就是多个webSocket通道就是多个观察者,而这个监听的出口就是被观察者,当消息队列出口出来一条消息的时候,就类似于被观察者的发生变化了然后通知多个webSocket通道,webSocket通道知道出来消息了马上就检查这条消息是不是自己要的,如果是的话就发送到当前通道中。在handleTextMessage方法中,会从客户端传回来一个参数message,这个message就是表示通道订阅的消息,也就是每次从队列里面出来一条消息,我就检查这条消息是否是我订阅的,即将消息解析后然后和message参数比对。不知道我有没有说清楚,应该是不难理解的。
那么采
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。