2013-02-18 72 views
5

Tôi là người mới đến NodeJS. Giả sử rằng tôi có máy chủ echo được triển khai với gói websocket của Golang:truy cập máy chủ websocket golang với máy khách 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()) 
    } 
} 

Mã khách hàng nodejs trông như thế nào?

+0

Bạn có chắc chắn muốn nói đến node.js và không phải là WebSockets của trình duyệt không? – tjameson

+0

Trình duyệt có thể sử dụng dịch vụ websocket. Nhưng những gì tôi quan tâm là liệu một ứng dụng nodejs độc lập có thể tiêu thụ nó hay không. –

Trả lời

7

Tôi nghĩ rằng this là thứ bạn đang tìm kiếm. Ví dụ nhanh sử dụng mã máy chủ của bạn:

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

Để làm việc này, bạn cần phải sửa đổi mã WebSocketClient trong lib/WebSocketCLient.js. Bình luận những dòng này ra (dòng 299-300 trên máy tính của tôi):

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

Đối với một số lý do thư viện WebSocket mà bạn cung cấp dường như không gửi "Sec-WebSocket-Nghị định thư" tiêu đề, hoặc ít nhất là khách hàng không tìm thấy nó. Tôi đã không làm quá nhiều thử nghiệm, nhưng một báo cáo lỗi có lẽ nên được nộp ở đâu đó.

Dưới đây là một ví dụ sử dụng một khách hàng 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

Câu trả lời đúng dưới đây ... Nếu bạn làm điều đó theo cách này may mắn nâng cấp –

18

Là tác giả của thư viện WebSocket-Node, tôi có thể đảm bảo với bạn rằng bạn không cần phải sửa đổi mã thư viện WebSocket-Node để không sử dụng subprotocol.

Mã ví dụ trên không chính xác cho thấy truyền một chuỗi rỗng cho tham số subprotocol của hàm connect(). Nếu bạn chọn không sử dụng subprotocol, bạn nên truyền giá trị null của JavaScript làm tham số thứ hai hoặc một mảng trống (thư viện có thể đề xuất nhiều subprotocols được hỗ trợ cho máy chủ từ xa theo thứ tự giảm dần), nhưng không trống chuỗi.

+0

Tình yêu như thế nào điều này đã không có bất kỳ upvotes .... – jtromans

+0

Giống như nghiêm trọng tại sao đây không phải là câu trả lời được chấp nhận? –

+0

@ brian-mckelvey Cảm ơn bạn đã bình luận. Tôi cần xác thực cơ bản trong url ws, Làm thế nào để làm điều đó? ws: // f68a8efd-dc55-405d-b1f0-b4433477d52a: [email protected]: 8011/v2/ws/websocket Đã thử theo cách này nhưng đã theo Lỗi. Connect Lỗi: Lỗi: Máy chủ đáp lại bằng một tình trạng phi-101: 401 Tiêu đề phản hồi Thực hiện theo: WWW-Authenticate: lĩnh vực cơ bản = "Xác thực yêu cầu" ngày: Thu, 08 Tháng Chín 2016 06:20:03 GMT độ dài nội dung: 25 loại nội dung: văn bản/đồng bằng; charset = utf-8 – Dibish

Các vấn đề liên quan