2013-02-18 28 views
5

Sono un novizio di NodeJS. Si supponga che ho un server eco implementato con il pacchetto di websocket Golang:accesso golang websocket server con client 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()) 
    } 
} 

Che cosa si deve il codice del client nodejs assomiglia?

+0

Sei sicuro di voler dire node.js e non browser WebSockets? – tjameson

+0

Il browser può utilizzare il servizio websocket. Ma quello che mi interessa è se una app nodejs autonoma può consumarlo. –

risposta

7

Penso che this sia quello che stai cercando. rapido esempio utilizzando il codice del server:

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"); 

Per ottenere questo lavoro, avrete bisogno di modificare il codice WebsocketClient in lib/WebSocketCLient.js. Commento queste linee fuori (linee 299-300 sulla mia macchina):

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

Per qualche ragione la libreria websocket che hai fornito non sembra per inviare l'intestazione "Sec-websocket-Protocol", o almeno il client non lo trova Non ho fatto troppi test, ma un bug report dovrebbe probabilmente essere archiviato da qualche parte.

Ecco un esempio utilizzando un client 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

Risposta corretta qui sotto ... Se lo fai in questo modo, buona fortuna, aggiornamento –

18

Come l'autore della biblioteca WebSocket-Node, vi posso assicurare che non è necessario modificare il codice della libreria WebSocket-Node, al fine di non utilizzare un subprotocollo.

Il codice di esempio sopra mostra erroneamente il passaggio di una stringa vuota per il parametro subprotocol della funzione connect(). Se si sceglie di non utilizzare un sottoprotocollo, è necessario passare il valore null di JavaScript come secondo parametro o un array vuoto (la libreria è in grado di suggerire più sottoprotocolli supportati sul server remoto in ordine di desiderabilità decrescente), ma non è vuoto stringa.

+0

Ama come questo non abbia avuto alcun upvotes .... – jtromans

+0

Come seriamente perché non è questa la risposta accettata? –

+0

@ brian-mckelvey Grazie per il tuo commento. Ho bisogno di autenticazione di base in ws url, come si fa? ws: // f68a8efd-dc55-405d-b1f0-b4433477d52a: [email protected]: 8011/v2/ws/websocket Ho provato in questo modo ma ho seguito l'errore. Collegare errore: Errore: server ha risposto con uno stato non-101: 401 Risposta intestazioni Seguire: WWW-Authenticate: Basic realm = "Autenticazione richiesta" Data: Giovedì, 8 Settembre 2016 06:20:03 GMT lunghezza del contenuto: 25 content-type: text/plain; charset = utf-8 – Dibish