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!
Die Verwendung von 'available()' ist keine zuverlässige Methode zum Lesen aller Daten eines 'InputStream'. – Titus
@Titus Was ist die Alternative? – MrDikke
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