Tomcat发布websocket
一、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 = "";@OnOpenpublic void onOpen(Session session) {// System.out.println(session.getMessageHandlers().);System.out.println("新客人为" + session.getId());this.session = session;guestSet.add(this);//加入map中addOnlineCount(); //在线数加1System.out.println("有新连接" + session.getId() + "加入!当前在线人数为" + getOnlineCount());}@OnClosepublic void onClose(Session session) {guestSet.remove(this); //从set中删除subOnlineCount(); //在线数减1System.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*/@OnErrorpublic void onError(Session session, Throwable error) {System.out.println("发生错误");error.printStackTrace();}/*** @param msg* @param session*/@OnMessagepublic 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 *;}