websocket - 在 Go 中提供 websocket

标签 websocket go

我开始使用 websockets + go 并且我认为我误解了 Go 中 websockets 的一些非常基本的东西。

我想简单地监听一个 websocket 连接并进行相应的处理。但是,我在 Go 中看到的所有使用 websocket 的示例都在为网页提供服务,然后连接到 websocket,这是一个要求吗?

以下是我设置的基本回显服务器:

package main

import (
  "fmt"
  "code.google.com/p/go.net/websocket"
  "net/http"
)

func webHandler(ws *websocket.Conn) {
  var s string
  fmt.Fscan(ws, &s)
  fmt.Println("Received: ", s)
}

func main() {
  fmt.Println("Starting websock server: ")
  http.Handle("/echo", websocket.Handler(webHandler))
  err := http.ListenAndServe(":8080", nil)
  if err != nil {
    panic("ListenAndServe: " + err.Error())
  }
}

这是用于连接的javascript:

ws = new WebSocket("ws://localhost:8080/echo");
ws.onmessage = function(e) {
    console.log("websock: " + e.data);
};

但这会导致: WebSocket 连接到 'ws://localhost:8080/echo' 失败:意外响应代码:403

最佳答案

从 Javascript 使用 websocket 时,您很少需要直接读取帧。老实说,我什至不知道该怎么做。

幸运的是,websocket 包已经有一个类型,Codec 可以为你做这件事。我的建议是使用预定义的 websocket.Message 编解码器来 RecieveSend 消息。

Message is a codec to send/receive text/binary data in a frame on WebSocket connection. To send/receive text frame, use string type. To send/receive binary frame, use []byte type.

使用 websocket.Message,您的 webHandler 将如下所示:

func webHandler(ws *websocket.Conn) {
    var in []byte
    if err := websocket.Message.Receive(ws, &in); err != nil {
        return
    }
    fmt.Printf("Received: %s\n", string(in))
    websocket.Message.Send(ws, in)      
}

而且,不,Go 不需要为网页提供服务。您收到的 403 错误与 Go 或 websocket 包无关。

关于websocket - 在 Go 中提供 websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19708330/

相关文章:

spring-mvc - Spring 4 WebSocket 配置端口

pointers - 如何通过引用设置接口(interface){}参数?

go - 为什么你需要在 gorilla session 中保存一些东西?

转到 Template.ParseFiles 和 filepath.Join

go - 带 Docker 的静态 Go 二进制文件 - 找不到入口点

渲染后返回语句的 Golang lint

linux - EC2 上的 80 端口 Websockets 陷入长轮询

spring - 使用 Spring 踩踏 websocket 和 sockJS 消息丢失

laravel - 使用 Laravel Echo、laravel-echo-server 和 socket.io 进行广播不起作用

node.js - 将主要的 socket.io 升级(1.4.5 到 2.0)部署到生产环境的建议方法