例行公事 - 为什么 websocket 报告连接已关闭?

标签 go websocket

我正在尝试使用 Go 创建客户端和服务器,但由于某种原因,服务器将连接报告为“已关闭”。由于代码很简单,我想不出我的代码有什么问题。感谢您的帮助。

package main

import (
    log "github.com/golang/glog"
    "net/http"
    "golang.org/x/net/websocket"
    "time"
    "flag"
)

type server struct {
    payload chan string
}

// srv pushes the messages received via ws into srv.payload
func (srv *server) serve(ws *websocket.Conn) {
    go func() {
        var msg string
        if err := websocket.Message.Receive(ws, &msg); err != nil {
            log.Exit(err)
        }
        srv.payload <- msg
    }()
    return
}

// This example demonstrates a trivial client/ server.
func main() {
    flag.Parse()
    srv := server{payload: make(chan string, 10)}
    http.Handle("/echo", websocket.Handler(srv.serve))
    go func() {
        err := http.ListenAndServe(":12345", nil)
        if err != nil {
            log.Errorf("ListenAndServe: " + err.Error())
        }
    }()
    // give the server some time to start listening
    time.Sleep(3 *time.Second)
    //dial and test the response.
    ws, err := websocket.Dial("ws://localhost:12345/echo", "", "http://localhost/?x=45")
    if err != nil {
        log.Exit(err)
    }
    ms := "test"
    if err := websocket.Message.Send(ws, ms); err != nil {
        log.Exit(err)
    }
    msg := <-srv.payload
    if msg != ms{
        log.Errorf("msg %v is not %v", ms)
    }

}

错误

 t.go:21] read tcp 127.0.0.1:12345->127.0.0.1:43135: 

编辑: 经过一些尝试和错误后,我发现如果我从 serve 方法中删除 go 例程,它可以工作,但对我来说没有意义。知道为什么当 websocket.Message.Receive 在单独的 go 例程中时它不起作用吗?

package main

import (
    log "github.com/golang/glog"
    "net/http"
    "golang.org/x/net/websocket"
    "time"
    "flag"
)

type server struct {
    payload chan string
}

// srv pushes the messages received via ws into srv.payload
func (srv *server) serve(ws *websocket.Conn) {
        var msg string
        if err := websocket.Message.Receive(ws, &msg); err != nil {
            log.Exit(err)
        }
        srv.payload <- msg 
    return
}

// This example demonstrates a trivial client/ server.
func main() {
    flag.Parse()
    srv := server{payload: make(chan string, 10)}

    go func() {
        http.Handle("/echo", websocket.Handler(srv.serve))
        err := http.ListenAndServe(":12345", nil)
        if err != nil {
            log.Errorf("ListenAndServe: " + err.Error())
        }
    }()
    // give the server some time to start listening
    time.Sleep(3 *time.Second)
    //dial and test the response.
    ws, err := websocket.Dial("ws://localhost:12345/echo", "", "http://localhost/?x=45")
    if err != nil {
        log.Exit(err)
    }
    ms := "test"
    if err := websocket.Message.Send(ws, ms); err != nil {
        log.Exit(err)
    }
    msg := <-srv.payload
    if msg != ms{
        log.Errorf("msg %v is not %v", ms)
    }

}

最佳答案

websocket 服务器 closes the connection当处理程序返回时。

删除 Go 例程是正确的解决方法。

关于例行公事 - 为什么 websocket 报告连接已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870743/

相关文章:

pointers - Go 相当于 C 中的 void 指针

运行 websockets secure (WSS) 的 node.js 服务器上的 SSL 证书

node.js - Node.js 上的 rxjs WebSocket 自动重新连接

javascript - 在 Node.js 中不使用库使用 websockets 的简单方法是什么?

java - 如何将 web-socket 映射到 url 模式?

amazon-web-services - AWS Golang SDK 是否包含对 Cognito 提供商的支持?

go - 从 Revel 中的 ViewArg 选择模板

android - 用于 Android 聊天应用程序的 Websockets

postgresql - Postgres 选择 WHERE col1, col2 IN 与 2d golang slice

go - 如何在 go 中修复并发合并排序