package com.cn.servlet;
import java.io.IOException;
import java.util.Map;
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 net.sf.json.JSONObject;
@ServerEndpoint("/webSocket/{username}")
public class WebSocket {
private static int onlineCount = 0;
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
private Session session;
private String username;
@onopen
public void onOpen(@PathParam("username") String username, Session session) throws IOException {
this.username = username;
System.out.println(username);
this.session = session;
addOnlineCount();
clients.put(username, this);
System.out.println(clients);
System.out.println("已连接");
}
@onclose
public void onClose() throws IOException {
clients.remove(username);
subOnlineCount();
}
@OnMessage
public void onMessage(String message) throws IOException {
JSONObject jsonTo = JSONObject.fromObject(message);
String mes = (String) jsonTo.get("message");
if (!jsonTo.get("To").equals("All")){
System.out.println("给到"+jsonTo.get("To").toString());
sendMessageTo(mes, jsonTo.get("To").toString());
}else{
sendMessageAll("给所有人");
}
}
@onerror
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
public void sendMessageTo(String message, String To) throws IOException {
System.out.println("进入方法");
// session.getBasicRemote().sendText(message);
//session.getAsyncRemote().sendText(message);
System.out.println(clients.values());
for (WebSocket item : clients.values()) {
System.out.println("进入for循环");
if (item.username.equals(To) )
System.out.println("进入if");
item.session.getAsyncRemote().sendText(message);
}
}
public void sendMessageAll(String message) throws IOException {
for (WebSocket item : clients.values()) {
item.session.getAsyncRemote().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocket.onlineCount--;
}
public static synchronized Map<String, WebSocket> getClients() {
return clients;
}
public static void main(String[] args) {
WebSocket ws = new WebSocket();
JSONObject jo = new JSONObject();
jo.put("message", "这个比密码不对还想登录!");
jo.put("To", "aaaa11");// 给用户名为admin的用户推送
try {
ws.onMessage(jo.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.util.Map;
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 net.sf.json.JSONObject;
@ServerEndpoint("/webSocket/{username}")
public class WebSocket {
private static int onlineCount = 0;
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
private Session session;
private String username;
@onopen
public void onOpen(@PathParam("username") String username, Session session) throws IOException {
this.username = username;
System.out.println(username);
this.session = session;
addOnlineCount();
clients.put(username, this);
System.out.println(clients);
System.out.println("已连接");
}
@onclose
public void onClose() throws IOException {
clients.remove(username);
subOnlineCount();
}
@OnMessage
public void onMessage(String message) throws IOException {
JSONObject jsonTo = JSONObject.fromObject(message);
String mes = (String) jsonTo.get("message");
if (!jsonTo.get("To").equals("All")){
System.out.println("给到"+jsonTo.get("To").toString());
sendMessageTo(mes, jsonTo.get("To").toString());
}else{
sendMessageAll("给所有人");
}
}
@onerror
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
public void sendMessageTo(String message, String To) throws IOException {
System.out.println("进入方法");
// session.getBasicRemote().sendText(message);
//session.getAsyncRemote().sendText(message);
System.out.println(clients.values());
for (WebSocket item : clients.values()) {
System.out.println("进入for循环");
if (item.username.equals(To) )
System.out.println("进入if");
item.session.getAsyncRemote().sendText(message);
}
}
public void sendMessageAll(String message) throws IOException {
for (WebSocket item : clients.values()) {
item.session.getAsyncRemote().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocket.onlineCount--;
}
public static synchronized Map<String, WebSocket> getClients() {
return clients;
}
public static void main(String[] args) {
WebSocket ws = new WebSocket();
JSONObject jo = new JSONObject();
jo.put("message", "这个比密码不对还想登录!");
jo.put("To", "aaaa11");// 给用户名为admin的用户推送
try {
ws.onMessage(jo.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}











