简单的websocket

1.创建一个websocket服务端
package Utils.websocket;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/***
*
* Websocket服务类
*
* @author user
*
*/
public class WebsocketServersg extends WebSocketServer {

		public static final Map<WebSocket, String> usercon = new HashMap<WebSocket, String>();
	
		
		public static Map<WebSocket, String> getUsercon() {
			return usercon;
		}
	
		public WebsocketServersg() throws UnknownHostException {
			
		}
	
		public WebsocketServersg(int port) throws UnknownHostException {
			super(new InetSocketAddress(port));
			System.out.println("websocket Server start at port:" + port);
		}
	
		/**
		 * 触发连接事件
		 */
		@Override
		public void onOpen(WebSocket conn, ClientHandshake clientHandshake) {
			System.out.println("新的客户端正在链接(onOpen)...:"
					+ conn.getRemoteSocketAddress().getAddress().getHostAddress());
		}
	
		/**
		 * 
		 * 连接断开时触发关闭事件
		 */
		@Override
		public void onClose(WebSocket conn, int code, String reason, boolean remote) {
	
			System.out.println("客户端关闭链接(onClose):" + usercon.get(conn));
			
			// 客户端断开连接就删除预存的WebSocket链接
			WebsocketServersgPool.removeUser(conn);
		}
	
		/**
		 * 
		 * 客户端发送消息到服务器时触发事件
		 * 
		 * @param conn
		 *            :客户端链接的信息
		 * @param message
		 *            :链接的用户账号
		 */
		@Override
		public void onMessage(WebSocket conn, String message) {
			System.out.println("新的客户端消息请注意(onMessage): " + message);
	
			// 将客户端链接服务端的信息暂时保存在usercon这个Map中,便于用java后台调用给客户端发送消息
			if(!WebsocketServersgPool.getCilentUser().containsKey(conn)){
				WebsocketServersgPool.addUser(message, conn);//添加客户端链接
			}
	
			// 向客户端发送消息
			//conn.send(message);
		}
	
		/**
		 * 触发异常事件
		 */
		@Override
		public void onError(WebSocket conn, Exception e) {
			if (conn != null) {
				System.out.println("发生异常");
			}
		}
	
		/**
		 * Main启动服务端
		 * 
		 * @param args
		 * @throws UnknownHostException
		 */
		public static void main(String[] args) throws UnknownHostException {
			
			new WebsocketServersg(9009).start();
		}
	
		/**
		 * 
		 * 启动服务端
		 * 
		 */
		public static void openingWebsocket() {
			System.out.println("websocket服务开启:" + 9009);
			try {
				new WebsocketServersg(9009).start();
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	
		/**
		 * 
		 * 关闭服务端
		 * 
		 */
		public static void closeWebsocket() {
			System.out.println("websocket服务关闭:" + 9009);
			try {
				new WebsocketServersg(9009).stop();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

2.创建一个websocket连接池
package Utils.websocket;

	import java.util.ArrayList;
	import java.util.Collection;
	import java.util.HashMap;
	import java.util.List;
	import java.util.Map;
	import java.util.Set;
	
	import org.java_websocket.WebSocket;
	/**
	 * 
	 * Websocket连接池
	 * 
	 * @author user
	 *
	 */
	public class WebsocketServersgPool {
	
		/**
		 * 连接池
		 */
		private static final Map<WebSocket,String> usercon = new HashMap<WebSocket,String>();
	
		/**
		 * 
		 * 获取所有的websocket客户端链接
		 * 
		 * @return
		 */
		public static Map<WebSocket,String> getCilentUser(){
			return usercon;	//添加连接
		}
		
		/**
		 * 向连接池中添加连接
		 * @param inbound
		 */
		public static void addUser(String user, WebSocket conn){
			usercon.put(conn,user);	//添加连接
		}
		
		/**
		 * 获取所有客户端
		 * @return
		 */
		public static Collection<String> getOnlineUser(){
			List<String> setUsers = new ArrayList<String>();
			Collection<String> setUser = usercon.values();
			for(String u:setUser){
				setUsers.add(u);
			}
			return setUsers;
		}
		
		/**
		 * 根据登陆者账号移除连接池中的连接
		 * @param inbound
		 */
		public static String userByRemoveUser(String userID){
			
			for (WebSocket wsds : usercon.keySet()) {
				if(usercon.get(wsds) == userID){
					removeUser(wsds);
				}
			}
			return "";
		}
		
		/**
		 * 移除连接池中的连接
		 * @param inbound
		 */
		public static boolean removeUser(WebSocket conn){
			if(usercon.containsKey(conn)){
				usercon.remove(conn);	//移除连接
				return true;
			}else{
				return false;
			}
		}
		
		/**
		 * 向指定的客户端发送数据
		 * @param user
		 * @param message
		 */
		public static void sendMessageToUser(WebSocket conn, String message){
			if(null != conn){
				conn.send(message);
			}
		}
		
		/**
		 * 向所有的客户端发送消息
		 * @param message
		 */
		public static void sendMessage(String message){
			Set<WebSocket> keySet = usercon.keySet();
			synchronized (keySet) {
				for (WebSocket conn : keySet) {
					String user = usercon.get(conn);
					if(user != null){
						conn.send(message);
					}
				}
			}
		}
	}

3.JS部分,在进行到页面,执行下边js
/**
*
* 启动websocket
*
*/
var ws;
function WebSocketOpening(){
if (“WebSocket” in window){
//alert(“您的浏览器支持 WebSocket!”);
// 创建一个 websocket
ws = new WebSocket(“ws://localhost:9009”);
ws.onopen = function(){
// Web Socket 已连接上,使用 send() 方法发送数据
//ws.send(“websocket已连接11111”);
console.log(“websocket已连接”);
//添加这个需要每隔账号对应单独的websocket客户端链接信息
ws.send(‘${session.get(“zhanghao”)}’);
// alert(“数据发送中…”);
};

				ws.onmessage = function (evt){ 
					//后台有消息,前台进行接收
					var received_msg = evt.data;
					console.log("websocket接收:"+received_msg);
					
					//接收消息后执行的js
					websocketMessage(received_msg);

// alert(“数据已接收…” + received_msg);
};
ws.onclose = function(){
// 关闭 websocket
// alert(“连接已关闭…”);
console.log(“websocket连接已关闭…”);
};
}else{
// 浏览器不支持 WebSocket
alert(“您的浏览器不支持 WebSocket!”);
}
}
/**
*
* websocket消息
*
/
function websocketMessage(messageInfo){
alert(“接收到消息了:”+messageInfo);
}
4.java后台给客户端发送消息
/
*
* 根据userID给这个用户发送消息
*
* @param userID: 用户账号
* @param type: one:单个人;all:所有人
* @param message:要发送的消息
*
*/
public static void sendWebsocketMess(String userID, String type, String message){
Map<WebSocket, String> wsobj = WebsocketServersgPool.getCilentUser();
System.out.println(“客户端链接数:” + wsobj.keySet().size());
// usercon:所有客户端链接上都会存储这个Map中
for (WebSocket wsg : wsobj.keySet()) {
//wsg.send(messageInfo);
//判断账号是否一样,给特定的用户发送提示消息
if(“one”.equals(type) && wsobj.get(wsg) != null && wsobj.get(wsg).equals(userID)){
WebsocketServersgPool.sendMessageToUser(wsg, message);
}else if(“all”.equals(type)){
WebsocketServersgPool.sendMessage(message);
break;
}
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值