首页>代码>Java WebSocket开发聊天室实例>/WebSocket/src/com/websocket/MyWebSocket.java
package com.websocket;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;

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;

//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping
@ServerEndpoint("/websocket/{user}")
public class MyWebSocket {
	// 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
	private static int onlineCount = 0;

	// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
	private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();

	private String user;

	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
	private Session session;

	/**
	 * 连接建立成功调用的方法
	 * 
	 * @param session
	 *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
	 * @throws IOException
	 */

	@OnOpen
	public void onOpen(@PathParam("user") String user, Session session)
			throws IOException {
		this.setUser(user);
		this.session = session;
		webSocketSet.add(this); // 加入set中
		addOnlineCount(); // 在线数加1
		System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
		// this.session.getBasicRemote().sendText(session.getId());
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose() {
		webSocketSet.remove(this); // 从set中删除
		subOnlineCount(); // 在线数减1
		System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用的方法
	 * 
	 * @param message
	 *            客户端发送过来的消息
	 * @param session
	 *            可选的参数
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		System.out.println("来自客户端的消息:" + message);
		String[] str = message.split(",");
		System.out.println(str[0]);
	
		// 群发消息
		for (MyWebSocket item : webSocketSet) {
			try {
				System.out.println(item.user);
				if (item.user.equals(str[0]) || item.user.equals(str[1])) {
					item.sendMessage(str[2]);
				}
			} catch (IOException e) {
				e.printStackTrace();
				continue;
			}
		}
	}

	/**
	 * 发生错误时调用
	 * 
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		System.out.println("发生错误");
		error.printStackTrace();
	}

	/**
	 * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
	 * 
	 * @param message
	 * @throws IOException
	 */
	public void sendMessage(String message) throws IOException {
		this.session.getBasicRemote().sendText(message);
		// this.session.getAsyncRemote().sendText(message);
	}

	public static synchronized int getOnlineCount() {
		return onlineCount;
	}

	public static synchronized void addOnlineCount() {
		MyWebSocket.onlineCount++;
	}

	public static synchronized void subOnlineCount() {
		MyWebSocket.onlineCount--;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}
}
最近下载更多
唐唐丶  LV34 2022年1月9日
八部天龙*  LV2 2021年8月7日
xiaobaitud  LV13 2021年7月8日
jenson2021  LV1 2021年1月25日
2196316269  LV10 2020年12月14日
zhangxu123  LV1 2020年10月27日
gaoxin222  LV14 2020年8月23日
wwwqqqqw  LV1 2020年7月1日
123109066  LV1 2020年6月16日
Unknow_12  LV1 2020年1月6日
最近浏览更多
13133117021  LV5 2024年12月24日
1709138965 2024年11月3日
暂无贡献等级
1561361683  LV1 2024年10月15日
hzz2311465 2024年10月8日
暂无贡献等级
3263394665  LV9 2024年8月31日
taoshen95  LV16 2024年6月18日
周鸣郝  LV2 2024年5月26日
taoyi123  LV17 2024年4月29日
xiexin  LV1 2024年4月16日
uni-code_0123  LV1 2024年1月31日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友