【问题标题】:Using channel with websocket通过 websocket 使用通道
【发布时间】:2019-01-12 22:20:39
【问题描述】:

如果我在 main 或 func home 的任何地方使用 chan,应用程序会运行,但实际上并不能正常工作。没有抛出错误,但是,它不起作用。 如果我删除频道引用,它会恢复工作。 通过在结构中使用 chan 或全局通道,应用程序将停止工作。

GET 请求中,它从func home 返回h.Message 通过在代码中添加任何频道,GET 请求不会返回消息。

https://play.golang.org/p/-ZVcLhZRRRG

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/websocket"
    // _ "github.com/go-sql-driver/mysql"
)

type WMessage struct {
    Message string `json:"message"`
    ch      chan string
}

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

var Chann chan string

func (h *WMessage) home(w http.ResponseWriter, r *http.Request) {
    h.Message = "hey this is the message from home"

    fmt.Fprintln(w, h.Message)
    fmt.Println(<-h.ch)
}

func main() {
    hom := &WMessage{}

    hom.ch = make(chan string)

    hom.ch <- "message sent"

    http.HandleFunc("/", hom.home)
    err := http.ListenAndServe(":3000", nil)
    if err != nil {
        fmt.Println("there was an error -> ", err)
    }
}

【问题讨论】:

  • “它不起作用”不是问题陈述。它以什么方式不起作用?你看到发生了什么?你有什么期待?
  • 装袋?我不知道那是什么意思。但我读了你的整个问题。你的问题确实回答了我问你的问题。具体来说:您认为发生了什么?你期望什么?
  • 我希望它返回到 h.Message ,由于某种原因,当在那里使用通道时,当向服务器发出 GET 请求时,它会停止返回 h.Message 。通过从代码中删除任何channel,它就可以工作了。

标签: go websocket


【解决方案1】:

无缓冲通道本质上是阻塞的,即写入通道 (hom.ch &lt;- "message sent") 和从通道读取 (fmt.Println(&lt;-h.ch)) 会阻塞 go-routine。

在您的情况下,http 服务器未运行,因为hom.ch &lt;- "message sent" 阻止了执行。这就是 GET 请求不起作用的原因。

一个简单的解决方案是改为使用缓冲通道。

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2016-02-19
    相关资源
    最近更新 更多