2016-08-08 5 views
3

Ich mache ein Remote-Debugging-Tool für Unity (C#), und ich habe einen C# WebSocket-Server im Spiel eingerichtet ProtokollnachrichtenWebsocket kann keine Nachrichten in Chrome/Firefox senden/empfangen, funktioniert gut auf Microsoft Edge

Der Remote-Debugging-Client befindet sich in JavaScript auf einer Seite, die von einem ebenfalls vom Spiel erstellten http-Server bedient wird.

Ich habe Probleme mit dem Senden von Nachrichten in einigen Browsern, und ich bin mir nicht sicher warum. Ich betreibe den Websocket-Server auf localhost und führe den Client lokal aus, und ich weiß, dass diese Art von Sachen von chrome/firefox nicht wirklich gemocht wird. Aber das Seltsame ist, dass ich keine harten Fehler oder Ausnahmen bekomme. Fehler scheinen still zu versagen.

Ich bin mir ziemlich sicher, dass das Problem JS/Browser ist, da der C# -Websocket-Server funktioniert und Verbindungen in allen Fällen erhält.

Wie auch immer, hier ist der Buchsenteil des Codes JS:

var socket = null; 
var host = "ws://"+window.location.hostname; 
var port = 55000; 
var url = host+":"+port+"/msg"; 

function CheckSocketStatus() 
{ 
    if(socket!=null){ 
     console.log(socket.readyState); 
    } 
} 

function CreateSocket() 
{ 
    socket = new WebSocket(url); 

    socket.onopen = function() 
    { 
     // // Web Socket is connected, send data using send() 
     console.log("Socket Open!"); 
     socket.send("Here's a client message for ya!"); 
    }; 

    socket.onmessage = function (evt) 
    { 
     var message = evt.data; 
     console.log("MSG: " + message); 
     var obj = JSON.parse(message); 
     console.log(obj) 
     console.log(obj.type) 
     if(obj.type == "log"){ 
      console.log("Recieved Log"); 
      handleLogMessage(obj); 
     } 
    }; 

    socket.onerror = function() 
    { 
     console.log("Error!"); 
    } 

    socket.onclose = function(event) 
    { 
     // websocket is closed. 
     console.log(event.code); 

     console.log("Connection is closed..."); 
     socket = null; 
    }; 
} 

In allen Fällen, wenn ich create() aufrufen, ein Socket erstellt wird und erfolgreich eine Verbindung mit dem Server. Ich habe auch diese CheckSocketStatus() -Funktion, die "1" zurückgibt, nachdem der Socket geöffnet wird (was bedeuten sollte, offen/bereit zum Senden/Empfangen). Danach sind hier die Ergebnisse:

Chrome:

Immediately Closes after sending a message.

Chrome wird sofort schließen nach dem Anschluss. Das einzige, was ich in der onopen() - Funktion mache, ist eine console.log() und eine send(). Wenn ich das send() entferne, bleibt der Socket offen. Ich erhalte keine Nachrichten vom Server.

Firefox: Firefox wird den Socket unbegrenzt offen halten, auch wenn ich die Funktion send() in onopen() aufrufen werde. Der Server empfängt jedoch keine Nachrichten vom Client und umgekehrt. Ich habe das Gefühl, dass es mir gelungen ist, Client-> Server früher zu senden, aber ich konnte das nicht reproduzieren, während ich auf diese Frage testet.

Microsoft Edge: Seltsam genug, arbeitet Edge-just fine. Ich kann Nachrichten empfangen und senden. Funktioniert genau wie beabsichtigt.

Knoten Webkit (nw.js): Ich versuche auch, dies als eine nw.js App zu schreiben. Wie vorauszusehen ist, da es auf Chrom (oder etwas Googly) läuft, liefert es die gleichen Ergebnisse wie Chrome.


Also ich bin mir nicht wirklich sicher, was los ist. Ich bin nicht wirklich ein Web-Programmierer, so komplizierte http Sachen sind nicht wirklich meine Stärke. Ich hoffe wirklich, dass es nur ein lokales Dateiproblem mit chrome/firefox ist und dass es auf diesen Plattformen funktioniert, wenn ich mich mit einem externen Host verbinde. Ich werde versuchen, dies morgen bei der Arbeit mit einem Nicht-Localhost-Server zu testen, und ich werde mit meinen Ergebnissen aktualisieren.

Ich denke, die Antwort, die ich suche, ist, was diese Symptome zeigen und wie ich Chrome/Firefox/Webkit richtig funktionieren kann.

Auch was macht Edge hier, dass die anderen nicht?

Vielen Dank im Voraus! Wenn Sie weitere Informationen von mir benötigen, fragen Sie einfach nach! Ich wollte diese Frage nicht überladen, nur für den Fall, dass es eine einfache Antwort gibt.

Update: Also versuchte ich gerade von meinem Laptop zu meinem Desktop verbinden und die gleichen Probleme bestehen immer noch. Zu meiner Überraschung ist das kein lokales Problem. Ich bin ein bisschen ratlos. Ich muss vielleicht auch den Servercode anschauen. Mir wurde auch gesagt, dass ich versuchen sollte, einen Wrapper wie socket.io zu verwenden, der einige plattformabhängige Probleme lösen könnte. Ich habe schon früher mit Socket.io/Unity gearbeitet, aber ich glaube nicht, dass ich diese Probleme hatte (Ich hatte auf der C# -Seite zu dieser Zeit keinen Server, es scheint keinen guten Socket zu geben. io Serverimplementierungen in C#, und ich bin mir nicht sicher, ob socket.io mit normalen Websockets interagiert). Das könnte also auf ein Problem mit meiner Implementierung auf der C# -Seite hinweisen.

+1

Ich kann nicht helfen, aber ich habe Websockets in Unity laufen hier http://github.com/greggman/hft-unity3d Chrome und Safari verbinden kein Problem und behalten ihre Verbindungen. Ich glaube nicht, dass dein Problem JavaScript ist. Ich denke, es ist C#. Browser betreiben Websockets im ganzen Netz. SO verwendet Websockets. Die API ist super einfach, nicht viel JavaScript kann versauen. C# websocket-Implementierung auf der anderen Seite als viel Arbeit zu tun. Ich benutze [websocket-sharp] (https://github.com/sta/websocket-sharp) – gman

+0

Ich benutze auch Websocket-sharp. Ich denke, die Version im Projekt wurde mit unserer Netzwerkbibliothek gebündelt, sodass ich versuchen kann, sie zu aktualisieren. Ich werde mir auch Ihre Implementierung ansehen und sehen, ob ich etwas falsch mache. Vielen Dank! – Nonameghost

Antwort

0

Also habe ich es herausgefunden, dank gman. Ich schaute auf seinen Code und bemerkte, dass er eine Einstellung in seiner WebSocketBehavior-Klasse namens "Ignore Extensions" verwendete.

Die websocket scharfe Dokumentation hat folgende zu sagen:

"Wenn es auf true gesetzt ist, wird der Dienst nicht den Sec-WebSocket-Extensions-Header in seiner Handshake-Antwort zurück."

"Ich denke, das ist nützlich, wenn Sie einen Fehler beim Verbinden des Servers bekommen und die Erweiterungen als Ursache des Fehlers ausschließen."

Also denke ich, dass dieser Header nicht gut mit Chrome/Firefox jive. Ich mache immer noch ein paar Tests, aber dies löste das Verhalten, das ich mit diesen Browsern sah.

Also, wenn Sie ähnliche Fehler bekommen, tun Sie das!

Verwandte Themen