最近项目里需要使用到websocket,主要用于前后端实时通信,项目中用到的场景是用户扫码乘车之后司机的设备需要语音提醒,思路是司机在打开乘车二维码时前端根据司机的用户ID发送websocket请求,后端在扫码乘车成功后发送消息,在本地测试一切正常,因为在本地与前端联调时没走网关,直接通过websocket所在服务端口来连接,但是上服务器由于服务端口不能对外暴漏,只能走网关或者通过nginx转发来实现,所以就出现了nginx转发成http请求这种问题。
这是websocket实现类代码:
WebSocketServerConvenientlife
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
//乘客扫码后司机角色登录的设备语音提示
@ServerEndpoint (value = "/convenientlife/websocket/{sessionId}")
@Component
public class WebSocketServerConvenientlife
{
private static Logger LOGGER = LoggerFactory.getLogger(WebSocketServerConvenientlife.class);
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<WebSocketServerConvenientlife> webSocketSet = new CopyOnWriteArraySet<>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
//接收sessionId(默认就是司机账户ID)
private String sessionId;
//接收message
private JSONObject message;
/**
* 连接建立成功调用的方法