一、tomcal的lib放入文件
tomcat-websocket.jar
websocket-api.jar
二、代码示例
package com.test.ws;
import com.test.core.json.Jmode;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by 51594 on 2024/3/18.
*/
@ServerEndpoint("/ws/test")
public class WsTest {
//静态变量,用来记录当前在线连接数。
private static AtomicInteger onlineCount = new AtomicInteger(0);
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
// 若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
//单一对话
//
// private static ConcurrentHashMap<String, TestController> guestSet = new ConcurrentHashMap<String, TestController>();
//广播
protected static CopyOnWriteArraySet<WsTest> guestSet = new CopyOnWriteArraySet<WsTest>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
private int user_id = 0;
private String user_name = "";
@OnOpen
public void onOpen(Session session) {
// System.out.println(session.getMessageHandlers().);
System.out.println("新客人为" + session.getId());
this.session = session;
guestSet.add(this);//加入map中
addOnlineCount(); //在线数加1
System.out.println("有新连接" + session.getId() + "加入!当前在线人数为" + getOnlineCount());
}
@OnClose
public void onClose(Session session) {
guestSet.remove(this); //从set中删除
subOnlineCount(); //在线数减1
System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
}
public static int getOnlineCount() {
return onlineCount.get();
}
public static void addOnlineCount() {
onlineCount.incrementAndGet();
}
public static void subOnlineCount() {
onlineCount.decrementAndGet();
}
/**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
/**
* @param msg
* @param session
*/
@OnMessage
public void onMessage(String msg, Session session) {
System.out.println("session----" + session);
System.out.println("req----" + msg);
try {
session.getBasicRemote().sendText(Jmode.n().set("msg", msg).toJson());
for (WsTest t : guestSet) {
t.session.getBasicRemote().sendText(Jmode.n().set("id", session.getId()).set("msg", msg).toJson());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、nginx配置:
location /salews/ {
proxy_pass http://localhost:8001/sale/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Access-Control-Allow-Methods *;
}