使用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议多个受支持的子协议),但不能为空串。