2016-04-12 25 views
0

Ich habe den folgenden HTML/JavaScript-Code, der Websockets verwendet, um mit einem Server zu kommunizieren. Es scheint, als ob ich nur send(message) nur innerhalb der onmessage() und onopen() Funktionen kann. Wie kann ich Daten außerhalb dieser Funktionen senden?Senden von Nachrichten mit Websockets

<!DOCTYPE HTML> 
<html> 
<head> 
    <script type="text/javascript"> 
     function WebSocketTest() { 
      if ("WebSocket" in window) { 
       var ws = new WebSocket("ws://localhost:57252/"); 

       ws.onopen = function() { 
        ws.send("Hi, from the client."); // this works 
        alert("Connection opened..."); 
       }; 

       ws.onmessage = function (event) { 
         alert("Message received..." + event.data); 
       }; 

       ws.onclose = function() { 
        alert("Connection closed..."); 
       }; 

       ws.send("Hi, from the client."); // doesn't work 
       ws.send("Hi, from the client."); // doesn't work 
      } 
     } 
    </script> 
</head> 
<body> 

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

</body> 
</html> 

Antwort

2

Sie haben wahrscheinlich eine Race Condition, in der Sie versuchen, einen send-Befehl auszuführen, obwohl der Socket möglicherweise noch nicht geöffnet wurde. Es ist ein wichtiger Hinweis on the MDN, die dieses Verhalten beschreibt:

Wie Herstellen einer Verbindung asynchron ist und anfällig für Fehler gibt es keine Garantie dafür gibt, dass die Methode send() Aufruf unmittelbar nach einem WebSocket-Objekt erstellt erfolgreich sein wird.

Sie rufen die send-Methode unmittelbar nach dem Erstellen eines WebSockets auf.

Wenn Sie diese Logik in eine Funktion verschieben und diese Funktion aufrufen, wenn Sie wissen, dass die Verbindung offen ist, könnte es Ihnen gut gehen. Zum Beispiel versuchen, den Code in ein Timeout oder eine andere Funktion zu bewegen, die manuell ausgelöst werden können, nachdem Sie wissen, dass die Socket-Verbindung hergestellt wurde:

function sendMyMessages() { 
    ws.send("Hi, from the client."); 
    ws.send("Hi, from the client."); 
} 

<button onclick="sendMyMessages()">Test</button> 
1

Da onopen ein asynchrones Ereignis ist.

Es ist ähnlich, dies zu tun:

var value; 
$.ajax({ 
    url: '/post/data', 
    success: function(response) { 
     value = response; 
    } 
}); 

alert(value); 

Was wir in der Warnung bekommen? undefined.

Der Websocket funktioniert in ähnlicher Weise, Sie können nicht send bis die Verbindung beendet ist zu öffnen. Es wird asynchron geöffnet. Wenn Sie also versuchen, send zu verwenden, müssen Sie sicherstellen, dass die Verbindung bereits geöffnet ist. Sie versuchen gerade, diese send-Aufrufe synchron zu verwenden, bevor die Verbindung tatsächlich geöffnet ist.

0

Dies ist die HTML-Datei von Sanic Webserver websocket Demo.

<!DOCTYPE html> 
<html> 
<head> 
    <title>WebSocket demo</title> 
</head> 
<body> 
    <script> 
     var ws = new WebSocket('ws://' + document.domain + ':' + location.port + '/feed'), 
      messages = document.createElement('ul'); 
     ws.onmessage = function (event) { 
      var messages = document.getElementsByTagName('ul')[0], 
       message = document.createElement('li'), 
       content = document.createTextNode('Received: ' + event.data); 
      message.appendChild(content); 
      messages.appendChild(message); 
     }; 
     document.body.appendChild(messages); 
     window.setInterval(function() { 
      data = 'bye!' 
      ws.send(data); 
      var messages = document.getElementsByTagName('ul')[0], 
       message = document.createElement('li'), 
       content = document.createTextNode('Sent: ' + data); 
      message.appendChild(content); 
      messages.appendChild(message); 
     }, 1000); 
    </script> 
</body> 

Verwandte Themen