dsdxlibt98300
2013-02-18 09:39
浏览 299

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

I am a newbie to NodeJS. Assume that I have a echo server implemented with Golang's websocket package:

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

What should the nodejs client code look like ?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • doulu2576 2013-02-19 16:07
    已采纳

    I think this is what you're looking for. Quick example using your server code:

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

    To get this to work, you'll need to modify the WebsocketClient code in lib/WebSocketCLient.js. Comment these lines out (lines 299-300 on my machine):

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

    For some reason the websocket library you provided doesn't seem to send the "Sec-Websocket-Protocol" header, or at least the client doesn't find it. I haven't done too much testing, but a bug report should probably be filed somewhere.

    Here's an example using a Go client:

    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]))
    }
    
    点赞 打赏 评论
  • douzhicong5965 2013-12-19 01:15

    As the author of the WebSocket-Node library, I can assure you that you do not need to modify the WebSocket-Node library code in order to not use a subprotocol.

    The example code above incorrectly shows passing an empty string for the subprotocol parameter of the connect() function. If you are choosing not to use a subprotocol, you should pass JavaScript's null value as the second parameter, or an empty array (the library is able to suggest multiple supported subprotocols to the remote server in order of descending desirability), but not an empty string.

    点赞 打赏 评论

相关推荐 更多相似问题