首页 文章

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

提问于
浏览
5

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

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())
    }
}

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

2 回答

  • 7

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

    上面的示例代码错误地显示为connect()函数的subprotocol参数传递空字符串 . 如果您选择不使用子协议,则应将JavaScript的空值作为第二个参数传递,或者传递一个空数组(该库能够以降低需求的顺序向远程服务器建议多个支持的子协议),但不是空的串 .

  • 19

    我认为this正是你要找的 . 使用服务器代码的快速示例:

    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”标头,或者至少客户端找不到它 . 我没有做太多的测试,但是应该在某个地方提交错误报告 .

    以下是使用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]))
    }
    

相关问题