使用nodejs客户端访问golang websocket服务器

我是NodeJS的新手。 假设我有一个使用Golang的websocket包实现的echo服务器:

包主要

import(
     “code.google.com/p/go.net/websocket”
     “日志”
     “networking/ HTTP”
 )

 func EchoServer(ws * websocket.Conn){
     var msgstring
     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)
    如果err!= nil {
        恐慌(err.Error())
     }
 }

nodejs客户端代码应该是什么样的?

我想这是你要找的。 使用您的服务器代码的快速示例

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

为了得到这个工作,你需要修改lib/WebSocketCLient.js的WebsocketClient代码。 注释这些行(我的机器上的299-300行):

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

出于某种原因,您提供的websocket库似乎没有发送“Sec-Websocket-Protocol”头文件,或者至less客户端没有find它。 我没有做太多的testing,但是一个bug报告应该可以在某个地方提交。

这是一个使用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])) } 

作为WebSocket-Node库的作者,我可以向您保证,您不需要修改WebSocket-Node库代码,以便不使用子协议。

上面的示例代码错误地显示为connect()函数的subprotocolparameter passing一个空string。 如果您select不使用子协议,则应将JavaScript的空值作为第二个参数,或者传入一个空数组(该库能够按照降序的顺序向远程服务器build议多个受支持的子协议),但不能为空串。