首页>代码>spring mvc+websocket实现信息推送(包括推送给所用和单独推送)>/springmvc/src/com/springmvc/service/WebSocketServer.java
package com.springmvc.service;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

 
/**
 * WebSocket 服务
 *
 **/
@ServerEndpoint(value = "/websocket/{userno}")
@Component
public class WebSocketServer {
 
	
	// 用来记录当前连接数的变量
	private static volatile int onlineCount = 0;
 
	// 线程安全Set,用来存放每个客户端对应的 WebSocket 对象
	//private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
	
	//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
	private static ConcurrentHashMap<String, WebSocketServer> webSocketSet = new ConcurrentHashMap<String, WebSocketServer>();
	   
 
	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
	private Session session;
 
	private String userno = "";

	
	/**
	 * 连接建立成功调用的方法
	 * @param session 连接会话
	 */
	@OnOpen
	public void onOpen(@PathParam(value = "userno") String param,Session session) {
		System.out.println(param);
        userno = param;//接收到发送消息的人员编号
        this.session = session;
        webSocketSet.put(param, this);//加入map中
        addOnlineCount();           //在线数加1
        System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
	}
 
	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose() {
		if (!userno.equals("")) {
            webSocketSet.remove(userno);  //从set中删除
            subOnlineCount();           //在线数减1
            System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
        }
	}
 
	/**
	 * 收到客户端消息后调用的方法
	 *
	 * @param message 消息
	 * @param session 连接会话
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		System.out.println("收到来自客户端的消息:" + message);
		
		if (1 > 2) {
            sendAll(message);
        } else {
            //给指定的人发消息
            sendToUser(message);
        }
 
		
	}
 
	private void sendToUser(String message) {
		 String sendUserno = message.split("[|]")[1];
	        String sendMessage = message.split("[|]")[0];
	        String now = getNowTime();
	        try {
	            if (webSocketSet.get(sendUserno) != null) {
	                webSocketSet.get(sendUserno).sendMessage(now + "用户" + userno + "发来消息:" + " <br/> " + sendMessage);
	            } else {
	                System.out.println("当前用户不在线");
	            }
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
		
	}

	private void sendAll(String message) {
		 String now = getNowTime();
	        String sendMessage = message.split("[|]")[0];
	        //遍历HashMap
	        for (String key : webSocketSet.keySet()) {
	            try {
	                //判断接收用户是否是当前发消息的用户
	                if (!userno.equals(key)) {
	                    webSocketSet.get(key).sendMessage(now + "用户" + userno + "发来消息:" + " <br/> " + sendMessage);
	                    System.out.println("key = " + key);
	                }
	            } catch (IOException e) {
	                e.printStackTrace();
	            }
	        }

	}

	private String getNowTime() {
			Date date = new Date();
	        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        String time = format.format(date);
	        return time;
	}

	/**
	 * 发生错误时调用的方法
	 *
	 * @param session 连接会话
	 * @param error 错误信息
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		System.err.println("发送错误");
		error.printStackTrace();
	}
 
	/**
	 * 实现服务器主动推送消息
	 *
	 * @param message 消息
	 * @throws IOException
	 */
	public void sendMessage(String message) throws IOException {
		this.session.getBasicRemote().sendText(message);
	}
 
	
 
	/**
	 * 获取连接数
	 * @return 连接数
	 */
	private static synchronized int getOnlineCount() {
		return onlineCount;
	}
 
	/**
	 * 连接数加1
	 */
	private static synchronized void addOnlineCount() {
		WebSocketServer.onlineCount++;
	}
 
	/**
	 * 连接数减1
	 */
	private static synchronized void subOnlineCount() {
		WebSocketServer.onlineCount--;
	}
 
}
最近下载更多
Tg171017  LV12 2023年9月6日
ewan007  LV30 2023年8月29日
朱俪的邮件及存储  LV8 2023年4月16日
neuwxr2015  LV8 2023年4月4日
lironggang  LV38 2023年2月16日
yangguang  LV8 2022年5月20日
ferrymen  LV6 2022年5月6日
sunluyang  LV1 2021年10月28日
ssh123  LV10 2021年8月24日
李想哈哈哈哈  LV1 2021年8月7日
最近浏览更多
fyliang888  LV7 2023年11月2日
ewan007  LV30 2023年8月29日
朱俪的邮件及存储  LV8 2023年4月16日
Rommel  LV27 2023年3月28日
newhaijun  LV15 2023年3月24日
lironggang  LV38 2023年2月16日
Tg171017  LV12 2023年2月3日
luoxiaoyan  LV2 2022年12月29日
GuoGuoX 2022年12月7日
暂无贡献等级
zhaoxu123123  LV10 2022年12月4日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友