2013-02-18 22 views
5

Jestem nowicjuszem NodeJS. Załóżmy, że mam zainstalowany serwer echa z pakietem websocket Golanga:dostęp do serwera sieci web golang z klientem nodejs

 
package main 

import (
    "code.google.com/p/go.net/websocket" 
    "log" 
    "net/http" 
) 

func EchoServer(ws *websocket.Conn) { 
    var msg string 
    websocket.Message.Receive(ws, &msg) 
    log.Printf("Message Got: %s\n", msg) 
    websocket.Message.Send(ws, msg) 
} 

func main() { 
    http.Handle("/echo", websocket.Handler(EchoServer)) 
    err := http.ListenAndServe(":8082", nil) 
    if err != nil { 
     panic(err.Error()) 
    } 
} 

Jak powinien wyglądać kod klienta nodejs?

+0

Czy na pewno masz na myśli plik node.js, a nie przeglądarkę WebSockets? – tjameson

+0

Przeglądarka może korzystać z usługi websocket. Ale interesuje mnie to, czy samodzielna aplikacja nodejs może ją konsumować. –

Odpowiedz

7

Myślę, że this jest tym, czego szukasz. Krótki przykład przy użyciu kodu serwera:

var WebSocketClient = require('websocket').client; 

var client = new WebSocketClient(); 

client.on('connectFailed', function(error) { 
    console.log('Connect Error: ' + error.toString()); 
}); 

client.on('connect', function(connection) { 
    console.log('WebSocket client connected'); 
    connection.on('error', function(error) { 
     console.log("Connection Error: " + error.toString()); 
    }); 
    connection.on('close', function() { 
     console.log('echo-protocol Connection Closed'); 
    }); 
    connection.on('message', function(message) { 
     if (message.type === 'utf8') { 
      console.log("Received: '" + message.utf8Data + "'"); 
     } 
    }); 

    connection.sendUTF("Hello world"); 
}); 

client.connect('ws://127.0.0.1:8082/echo', "", "http://localhost:8082"); 

Aby to zadziałało, musisz zmodyfikować kod WebsocketClient w lib/WebSocketCLient.js. Komentarz te linie na zewnątrz (linie 299-300 na moim komputerze):

 //this.failHandshake("Expected a Sec-WebSocket-Protocol header."); 
     //return; 

Z jakiegoś powodu biblioteka websocket podałeś nie wydaje się, aby wysłać „Sec-websocket-Protocol” nagłówek, albo przynajmniej klienckie nie znajduje go. Nie zrobiłem zbyt wiele testów, ale raport o błędzie powinien być gdzieś zgłoszony.

Oto przykład przy użyciu klienta Go:

package main 

import (
    "fmt" 
    "code.google.com/p/go.net/websocket" 
) 

const message = "Hello world" 

func main() { 
    ws, err := websocket.Dial("ws://localhost:8082/echo", "", "http://localhost:8082") 
    if err != nil { 
     panic(err) 
    } 
    if _, err := ws.Write([]byte(message)); err != nil { 
     panic(err) 
    } 
    var resp = make([]byte, 4096) 
    n, err := ws.Read(resp) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println("Received:", string(resp[0:n])) 
} 
+1

Prawidłowa odpowiedź poniżej ... Jeśli zrobisz to w ten sposób, powinieneś uaktualnić –

18

Jako autor biblioteki websocket-Node, mogę was zapewnić, że nie trzeba zmodyfikować kod biblioteki websocket-węzeł w celu nie użyj podprocedury.

Powyższy przykładowy kod niepoprawnie pokazuje przekazanie pustego ciągu dla parametru subprotocol funkcji connect(). Jeśli zdecydujesz się nie używać podklucza, powinieneś podać wartość null JavaScript jako drugi parametr lub pustą tablicę (biblioteka jest w stanie zasugerować wiele obsługiwanych podprotokołów na serwerze zdalnym w porządku malejącej potrzeby), ale nie jest pusta strunowy.

+0

Uwielbiam, jak to nie miało żadnych przebojów .... – jtromans

+0

Jak poważnie, dlaczego nie jest to zaakceptowana odpowiedź? –

+0

@ brian-mckelvey Dziękuję za komentarz. Potrzebuję podstawowego uwierzytelnienia w adresie URL ws, jak to zrobić? ws: // f68a8efd-dc55-405d-b1f0-b4433477d52a: [email protected]: 8011/v2/ws/websocket Próbowano w ten sposób, ale wystąpił błąd. Połącz Błąd: Błąd: serwer odpowiedział non-101 stan: 401 Response Główki następująco: www-uwierzytelniać: Podstawowa realm = "Autoryzacja wymagana" datę: Pn, 08 wrz 2016 06:20:03 GMT długość treści: 25 typ treści: tekst/zwykły; charset = utf-8 – Dibish

Powiązane problemy