idea+spring boot +jdk1.8
1:WebSocket創建
在web項目啟動后,啟動WebSocket
@Component public class ApplicationInit implements CommandLineRunner, ApplicationListener<ApplicationEvent> { private static Log logger = LogFactory.getLog(ApplicationInit.class); @Override public void run(String... args) { System.out.println("------------------------ Spring初始化完畢 ------------------------"); logger.error("---" + Arrays.toString(args) + "---"); WsPool.startWebsocketInstantMsg(); }
}
2:啟動webSocket的方法
/** * 啟動websocket */ public static void startWebsocketInstantMsg() { System.out.println("startWebsocketInstantMsg:System"); InetSocketAddress inetSocketAddress = new InetSocketAddress(10000); //端口號 WebSocketImpl.DEBUG = false; MyWebScoket webScoket; webScoket = new MyWebScoket(inetSocketAddress); webScoket.start(); System.out.println("----------websocket啟動成功---------------"); InetAddress address = inetSocketAddress.getAddress(); String hostName = inetSocketAddress.getHostName(); int port = inetSocketAddress.getPort(); System.out.println("inetSocketAddress::address==" + address + " hostName==" + hostName + " port==" + port); }
因為wss是要經過證書的,就像https一樣,所以要么請求附帶證書,要么使用nginx代理(nginx需要已經配置證書)
3:配置nginx代理webSocket
location /websocket{ index index.html index.htm; proxy_pass http://localhost:10010; include proxy.conf; // 其他的通用的代理設置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; // webSocket需要的獨有的頭部設置 proxy_set_header Connection “Upgrade”; }
加上:
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “Upgrade”;
(模擬WebSocket的頭部請求信息)
4:請求
http://域名/websocket nginx自動將請求轉發到 10000 端口
附:前端連接后端WebSocket觸發的方法
/** *建立連接 * * @param conn * @param handshake */ @Override public void onOpen(WebSocket conn, ClientHandshake handshake) { System.out.println("onOpen::連接成功"); // wss連接的時候觸發的代碼 String openId = handshake.getFieldValue("openId"); //此處可以獲取前端傳入的參數 this.userJoin(openId, conn); }
/** * 關閉連接 * * @param conn 關閉連接的用戶 * @param code 密碼 * @param reason 原因 * @param remote 返回遠程主機是否啟動了連接的關閉。 */ @Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { //斷開連接時候觸發代碼 System.out.println("onClose::斷開連接"); userLeave(conn); System.out.println(reason); }
/** * 接收到前端的消息 * * @param conn 遠程主機(用戶) * @param message 消息 */ @Override public void onMessage(WebSocket conn, String message) { System.out.println("接收消息:" + message); JSONObject jsonObject = JsonUtils.parseString(message); }
// 出現異常
@Override public void onError(WebSocket conn, Exception ex) { //錯誤時候觸發的代碼 System.out.println("on error"); ex.printStackTrace(); }