1、HandshakeInterceptor 类实现握手,获取session中的登陆用户信息,用以区分WebSocketSession,对指定用户进行推送信息。可使用WebSocketSession对象获取对应的用户:session.getAttributes().get( "username" ) public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake( ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes ) throws Exception { // 获取登录用户 if ( request instanceof ServletServerHttpRequest ) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession( false ); if ( session != null ) { // 使用userName区分WebSocketHandler,以便定向发送消息 String username = (String) session.getAttribute( "username" ); attributes.put( "username", username ); } } return true; } @Override public void afterHandshake( ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex ) { }} 2、MyWebSocketHandler类:消息处理类,需要实现WebSocketHandler接口。定义静态变量users集合,记录当前登录用户的WebSocketSession信息。 public class WebsocketEndPoint implements WebSocketHandler { private static final ArrayList<WebSocketSession> users; static { users = new ArrayList<WebSocketSession>(); } @Override public void afterConnectionEstablished( WebSocketSession session ) throws Exception { users.add( session ); String username = (String) session.getAttributes().get( "username" ); System.out.println( username + "登陆成功" ); } @Override public void handleMessage( WebSocketSession session, WebSocketMessage<?> message ) throws Exception { // TODO Auto-generated method stub System.out.println( "接收到用户:" + (String) session.getAttributes().get( "username" ) + " 发送的信息:" + message.getPayload().toString() ); sendMessageToUser( "dave", new TextMessage( (String) session.getAttributes().get( "username" ) + "发送给您:" + message.getPayload() ) ); } @Override public void handleTransportError( WebSocketSession session, Throwable exception ) throws Exception { // TODO Auto-generated method stub } @Override public void afterConnectionClosed( WebSocketSession session, CloseStatus closeStatus ) throws Exception { // TODO Auto-generated method stub } @Override public boolean supportsPartialMessages() { // TODO Auto-generated method stub return false; } public void sendMessageToUser( String username, TextMessage message ) throws IOException { for ( WebSocketSession user : users ) { if ( username.equals( user.getAttributes().get( "username" ) ) ) { user.sendMessage( message ); } } } } 3、springmvc配置文件: <bean id="websocket" class="com.websocket.websocket.MyWebSocketHandler"/> <websocket:handlers> <websocket:mapping path="/ws" handler="websocket"/> <websocket:handshake-interceptors> <bean class="com.websocket.websocket.HandshakeInterceptor"/> </websocket:handshake-interceptors> </websocket:handlers> 4、html页面: //判断当前浏览器是否支持websocket if('WebSocket' in window){ websocket = new WebSocket("ws://localhost:8080/wesocket/ws"); }else{ alert("non-support"); } //连接发生错误 websocket.onerror = function(){ alert("error connect"); }; //连接成功 websocket.onopen = function(){ alert("open connnect"); }; //接收到的消息 websocket.onmessage = function(event){ alert(event.data); }; //连接关闭 websocket.onclose = function(){ alert("close"); websocket.close(); }; }) //发送消息 $("#sendBtn").click(function(){ websocket.send("我是admin用户"); }) 资料参考网址: http://www.cnblogs.com/winkey4986/p/5478332.html http://www./posts/view/21 |
|
来自: _超级赛亚人_ > 《websocket》