如何保持websocket存活

问题描述 投票:0回答:1

我正在建立 websocket 连接,其中服务器使用

javax.websocket
构建,客户端使用 JavaScript。

这些代码运行良好。但过了一段时间,会议就要结束了。我想让这个会议继续下去。

我有两个问题:

  1. 如果此连接由于会话空闲时间而关闭 出
  2. 如何保持此会话的活力。

以下是 JavaScript 代码:

var wsUri="ws://localhost/";
var websocket = new WebSocket(wsUri);

var datasocket;
var username;
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
function join() {
    username = textField.value;
    websocket.send(username + " joined");
    console.log("joined");
}

function send_message() {
    websocket.send(username + ": " + textField.value);
}

function onOpen() {
    console.log("connected to url");
    websocket.send("Hello");
    //  writeToScreen("Connected to " + wsUri);
}

function onMessage(evt) {
var res = {};
    console.log("onMessage: " + evt.data);
    if (evt.data.indexOf("joined") != -1) {   
    } else {
        datasocket=evt.data
        //getLatestData();
        res = JSON.parse(event.data);
        $scope.Impact = res["Impact"];
        $scope.Temperature = res["Temperature"];
        $scope.Humidity = res["Humidity"];
    }
}

function onError(evt) {
    writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
} 

function writeToScreen(message) {
//    output.innerHTML += message + "<br>";
}
function onClose(evt)
{
    console.log("Disconnected");
}

Java代码如下:

@javax.websocket.server.ServerEndpoint("/")
public class Endpoint {
     
    private static Queue<Session> queue = new ConcurrentLinkedQueue<Session>();
    static StringBuilder sb = null;
    ByteArrayOutputStream bytes = null;

    
    @OnMessage
    public void onMessage(Session session, String msg) {
        // provided for completeness, in out scenario clients don't send any msg.
        try {   
            // System.out.println("received msg "+msg+" from "+session.getId());
    
           sendAll(msg);  
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
   
    private static void sendAll(String msg) {

        JSONParser parser = new JSONParser();
        Object obj = null ;

        try {
            obj = parser.parse(msg);
        } catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        JSONObject jsonObject = (JSONObject) obj;
        
        if (sb == null) {
            sb = new StringBuilder();
        }
        sb.append(jsonObject.toString());
     
        //     System.out.println(jsonObject.toJSONString());
        try {
            /* Send the new rate to all open WebSocket sessions */  
            ArrayList<Session > closedSessions= new ArrayList<>();
            for (Session session : queue) {
                if(!session.isOpen()) {
                     System.err.println("Closed session: "+session.getId());
                     closedSessions.add(session);
                }
                else {
                    session.getBasicRemote().sendText(msg);
                }
            }
            queue.removeAll(closedSessions);
            //     System.out.println("Sending "+msg+" to "+queue.size()+" clients");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        
        sb = null;
        
    }
    
    @OnOpen
    public void open(Session session) {
         queue.add(session);
         System.out.println("New session opened: "+session.getId());
    }
     
    @OnError
    public void error(Session session, Throwable t) {
        queue.remove(session);
        System.err.println("Error on session "+session.getId());  
    }
    
    @OnClose
    public void closedConnection(Session session) { 
        queue.remove(session);
        System.out.println("session closed: "+session.getId());
    }
    
}
javascript java websocket java-websocket
1个回答
0
投票

您可以在 IdleTimout 中使用负数来禁用服务器中的超时

session.setMaxIdleTimeout(-1)

如果容器处于非活动状态(即没有发送或接收消息),则设置容器关闭该会话之前的非零毫秒数。 0 或负值表示会话永远不会因不活动而超时。

© www.soinside.com 2019 - 2024. All rights reserved.