2016-11-04 1 views
1

Ich habe die folgende Setup bekam: Index.HTML (WebPage)Input Java von JavaScript Websocket wird immer keine vollständige Nachricht

<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-Socket-Server

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; 
} 

Das Problem ist, dass Die Nachricht ist durch, aber ich bekomme dies als Ausgabe (abgesehen von "Added" & "Decoded" Debug-Meldungen,

[ 19:42:02 INFO]: Gesamt: [72, 101, 108, 108, 111, 95] [19:42:02 INFO]: Text: Hallo_

Also "Welt!" Ist verloren, auch wenn Ich ersetze das _ durch ein Leerzeichen. Gibt es etwas, das ich übersehen habe?

Ich hoffe, dass jemand mir hier einen Tipp geben kann. Vielen Dank im Voraus!

+1

Die Verwendung von 'available()' ist keine zuverlässige Methode zum Lesen aller Daten eines 'InputStream'. – Titus

+0

@Titus Was ist die Alternative? – MrDikke

+2

Sie stimmen die Daten vom 'InputStream' ab, bis Sie das Ende der Datei'EOF' erreichen oder bis eine ganze Nachricht gelesen wird. Die zweite Option (bis eine ganze Nachricht gelesen wird) hängt vom verwendeten Protokoll ab. Wenn Sie das 'Websocket'-Protokoll selbst implementieren wollen, müssen Sie die Dokumentation durchgehen, um zu sehen, wie es funktioniert. – Titus

Antwort

0

Casting es dann Datainputstream

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

scheint es zu beheben! Danke @Tinus für die Hilfe zu dieser Lösung!

Verwandte Themen