2016-11-04 51 views
1

我有以下設置: 的Index.html(好康)的InputStream的Java沒有得到完整的郵件

<div id="sse"> 
     <a href="javascript:WebSocketTest()">Run WebSocket</a> 
     <a href="javascript:websocketsend()">Send message</a> 
     </div> 

    <script type="text/javascript"> 
     var ws; 
     function WebSocketTest() 
     { 
      if ("WebSocket" in window) 
      { 
       console.log("WebSocket is supported by your Browser!"); 

       // Let us open a web socket 
       ws = new WebSocket("ws://localhost:6790/"); 

       ws.onopen = function() 
       { 
        // Web Socket is connected, send data using send() 

        ws.send("Hello_World!"); 
        console.log("Message is sent..."); 

       }; 

       ws.onmessage = function (evt) 
       { 
        var received_msg = evt.data; 
        console.log("Message is received..."); 
       }; 

       ws.onclose = function(event) 
       { 
        var reason; 
        // websocket is closed. 
        console.log(event.code); 
        console.log("closed.") 
       } 

       ws.onerror = function (evt) 
       { 
        console.log(evt); 
       } 
      } 

      else 
      { 
       // The browser doesn't support WebSocket 
       console.log("WebSocket NOT supported by your Browser!"); 
      } 
     } 
    </script> 

的Java套接字服務器

private String decodeMessage(InputStream in) { 
    Main.debug(in + ""); 
    try { 
     in.skip(2); 
     ArrayList<Byte> keys = new ArrayList<Byte>(); 
     for(int i = 0; i < 4; i++){ 
      int r = in.read(); 
      Main.debug("added: " + r); 
      keys.add((byte) r); 
     } 

     ArrayList<Byte> encoded = new ArrayList<Byte>(); 
     for(int i = 0; i < in.available(); i++){ 
      int r = in.read(); 
      Main.debug("added2: " + r); 
      encoded.add((byte) r); 
     } 

     ArrayList<Byte> decoded = new ArrayList<Byte>(); 
     for(int i = 0; i < encoded.size(); i++){ 
      decoded.add((byte) (encoded.get(i)^keys.get(i & 0x3))); 
      Main.debug("Decoded: " + (encoded.get(i)^keys.get(i & 0x3))); 
     } 

     Main.debug("Total: " + decoded); 
     String s = new String(toByteArray(decoded), "US-ASCII"); 
     Main.debug("Text: " + s); 

    } catch(IOException e) { 

    } 

    return null; 
}  

public static byte[] toByteArray(List<Byte> in) { 
    final int n = in.size(); 
    byte ret[] = new byte[n]; 
    for (int i = 0; i < n; i++) { 
     ret[i] = in.get(i); 
    } 
    return ret; 
} 

的問題是,消息得到通過罰款,但是我得到這個作爲輸出 (除了「增加」&「解碼」調試消息,

[ 19:42:02信息]:總數:[72,101,108,108,111,95] [19:42:02信息]:文本:你好_

所以「世界!」丟失,即使我用空格替換_。 有什麼我可以忽略的?

我希望有人能給我一個提示。 在此先感謝!

+1

使用'available()'不是讀取'InputStream'中所有數據的可靠方法。 – Titus

+0

@Titus有什麼選擇? – MrDikke

+2

您將'InputStream'中的數據返回到文件'EOF'的末尾,或直到讀取完整消息。第二種選擇(直到讀完整條消息)取決於你使用的協議,如果你想自己實現'websocket'協議,你必須通過文檔來看看它是如何工作的。 – Titus

回答

0

它鑄造於DataInputStream類則

while(datainputstream.available() > 0){ 
    .... 
} 

似乎解決了! 感謝@Tinus幫助我獲得此解決方案!