2017-09-04 66 views
0

以下是我的Websocket訂閱代碼。如何在Javax.websocket上從Websocket訂閱者(客戶端)讀取json請求?

客戶端:

var request = '{"sessionId": "_fjuhdf896786767", "username":"admin", "status":true}' 
ws = new WebSocket(wsUri); 
console.log("registered"); 
    ws.onopen = function() { 
     console.log("connection opened!") 
     ws.send(request); 
    } 

    ws.onmessage = function(msg) { 
     console.log("received message:"); 
     window.getData(JSON.parse(msg.data)); 
    } 

在服務器端,網頁套接字的implementioation低於:

@ServerEndPoint(value="/status") 
public class WebsocketServer { 

    @OnOpen 
    public void OpenMsg(Session session, EndpointConfig cnfg) { 

     String retdata = ""; 
     try { 
      if (session.isOpen()) { 
       log.info("OpenMsg() payload req data from client" + decoder); 
       retdata = getCount(decoder); 
       log.info("OpenMsg() retdata " + retdata); 
       session.getBasicRemote().sendText(retdata.toString()); 
       try { 
        Thread.sleep(pollinterval); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (IOException e) { 
      try { 
       session.close(); 
       log.error("Exception occured while Opening WS Session"); 
       e.printStackTrace(); 
      } catch (IOException e1) { 
       // Ignore 
      } 
     } 

    }     
} 

我想知道如何從「ws.send讀取JSON請求字符串(請求);」在服務器端(javax.websocket)。 我看到了編碼器和解碼器,但在這種情況下,我只發送json請求作爲一個字符串,不編碼如上所示。 任何機構可以告訴我,如何讀取json字符串作爲Javax.websocket中的有效載荷。

回答

0

我想,一個簡單的JSON的讀者會做的伎倆:

@OnMessage 
public void onMessage(Session session, String message) { 
    JsonObject json = Json.createReader(new StringReader(message)).readObject(); 
    System.out.println("Received json: " + json); 
    // or do something more JSON-like: 
    // String myField = json.getString("key"); 
} 

編碼器和解碼器都沒有直接聯繫的有效載荷,而是如果你想直接操縱的對象。如果您使用的解碼器,你onMessage方法可以像

@OnMessage 
public void onMessage(Session session, MyMessageClass message){ 
    String myInput = message.getInput(); 
    String otherUsefulInformation = message.getInformation(); 
} 

,當你使用編碼器,它是關於發送,而不是純文本對象:

@OnMessage 
public void onMessage(Session session, MyMessageClass message){ 
    // process input 

    MyAnswerClass answer = new MyAnswerClass(...); 
    session.getBasicRemote().sendObject(answer); 

    // without encoder, you are bound to use 
    // session.getBasicRemote().sendText(...) 
    // or 
    // session.getBasicRemote().sendBinary(...) 
} 
+0

你好謝謝@ASE,我想獲得它在JavaScript客戶端使用「ws.send(MSG)」中的OnOpen方法 –

+0

對不起,我不能完全理解你的觀點發送是java的WebSocket服務器味精:'ws.onopen'發送的消息被'@ OnMessage'服務器端捕獲,因爲連接已經建立。反過來說,如果你通過'@ OnOpen'服務器端發送了一條消息,它將由'ws.onmessage'客戶端處理 – Al1

相關問題