2017-02-24 3 views
0

Ich möchte mit Websockets ein bisschen geigen. Ich installierte ein „websocket-Rubin“ genannt Ruby-Juwel (https://github.com/imanel/websocket-ruby) ich eine hebel/IRB-Sitzung gestartet und tippe:Beispiel JavaScript kann keine Verbindung zu Ruby WebSocket-Server

require "websocket" 
@handshake = WebSocket::Handshake::Server.new(:host => "localhost", :port => 8080,:secure=>true) 

Dies startet einen WebSocket-Server, soweit ich weiß. Dann öffnete ich in meinem Browser die Javascript HTML-Seite, die auf den Server zu verbinden versuchen:

<!doctype html> 
<html lang="en"> 
<head> 
    <title>Websocket Client</title> 
</head> 
<body> 
    <script> 
    var exampleSocket = new WebSocket("wss://localhost:8080"); 
    exampleSocket.onopen = function (event) { 
     exampleSocket.send("Can you hear me?"); 
    }; 
    exampleSocket.onmessage = function (event) { 
     console.log(event.data); 
    } 
    </script> 
</body> 
</html> 

Aber es sagt in dem Konsolenprotokoll:

failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED 

ich verschiedene Ports versucht, sowohl in Server und in der Client: 8081, 12345, aber ich bekomme immer diese Fehlermeldung.

Antwort

0

Ich habe eine Idee über Websocket und Javascript, aber nicht Websocket-Ruby. Ich hoffe es wird dir behilflich sein.

In NodeJS .. server.js Datei,

var WebSocketServer = require("ws").Server; 

var wss = new WebSocketServer({port:8100}); 

console.log("websocket Server is Running..."); 

wss.on('connection', function connection(ws) { 
    // Store the remote systems IP address as "remoteIp". 
    var remoteIp = ws.upgradeReq.connection.remoteAddress; 
    // Print a log with the IP of the client that connected. 
    console.log('Connection received: ', remoteIp); 
    // Add a listener which listens for the "message" event. 

    // When a "message" event is received, take the contents 
    // of the message and pass it to the broadcast() function. 
    ws.on('message', wss.broadcast); 
}); 

wss.broadcast = function(msg) { 
    wss.clients.forEach(function each(client) { 
     client.send(msg); 
    }) 
}; 

In Javascript unten Code schreiben ...

var SERVER_URL = 'ws://localhost:8100'; 
     //instead of localhost you can also use IP address of your system 
var ws; 

    function connect() { 
     alert('connect'); 
     ws = new WebSocket(SERVER_URL, []); 
     // Set the function to be called when a message is received. 
     ws.onmessage = handleMessageReceived; 
     // Set the function to be called when we have connected to the server. 
     ws.onopen = handleConnected; 
     // Set the function to be called when an error occurs. 
     ws.onerror = handleError; 
    } 

    function handleMessageReceived(data) { 
     // Simply call logMessage(), passing the received data. 
     logMessage(data.data); 
    } 

    function handleConnected(data) { 
     // Create a log message which explains what has happened and includes 
     // the url we have connected too. 
     var logMsg = 'Connected to server: ' + data.target.url; 
     // Add the message to the log. 
     logMessage(logMsg) 
    } 

    function handleError(err) { 
     // Print the error to the console so we can debug it. 
     console.log("Error: ", err); 
    } 

    function logMessage(msg) { 
     // with the new message. 
     console.log(msg); 
    } 

    /** This is the scope function that is called when a users hits send. */ 
    function sendMessage{ 
     ws.send(msg); 
    }; 
connect(); 

in html eine Schaltfläche Nachricht senden Server

<button onclick="sendMessage('Hi Websocket')">send message</button> 
WebSocket
+0

Thx, aber was ist $ Scope? Die Konsole sagt "$ Scope ist nicht definiert". Ist es JQuery? – Konstantin

+0

Ich habe jetzt bearbeitet ... PLZ einmal prüfen. Wenn Sie irgendwelche Zweifel haben, zögern Sie nicht zu fragen –

0

Der Ruby-Code, den Sie vorgestellt haben, tut meines Wissens nicht starten Sie einen Websocket Server ... was es tut, ist eine Server-Seite Parser initiieren.

Um einen Server zu starten, müssen Sie einen echten Websocket-Server verwenden.

ActionCable (mit Rails) verwendet die Bibliothek websocket-ruby zum Analysieren von Websocket-Ereignissen und verwendet nio4r, um den tatsächlichen Server zu betreiben.

Faye haben eine ähnliche Lösung und em-websockets verwenden Sie die websocket-ruby Edelstein mit EventMachine.

Andere Ruby Websocket-Server enthalten Iodine, die die C-Bibliothek facil.io verwendet. Jod wird sowohl vom Framework plezi als auch unabhängig verwendet.

Da Sie versuchen, einen Echo-Server ausgeführt werden, hier ist ein kurzes Beispiel der Plezi Framework (Sie können es als Middleware in Sinatra oder Rails verwenden) ...

... in einem config.ru folgendes platzieren Datei:

require 'plezi' 
class WebsocketSample 
    # HTTP index 
    def index 
    'Hello World!' 
    end 

    # called when Websocket data is recieved 
    # 
    # data is a string that contains binary or UTF8 (message dependent) data. 
    def on_message(data) 
    puts "Websocket got: #{data}" 
    write data 
    end 
end 
Plezi.route '/', WebsocketSample 
run Plezi.app 

den Server, Anruf auszuführen (ignorieren sie die $ Zeichen, markiert sie diesen Code als Terminal-Code):

$ iodine 

Bekanntmachung: Jod erfordert eine BSD/Unix/Linux-Maschine, wie MacOS, Ubuntu, etc '. Unter Windows funktioniert es nicht.

Verwandte Themen