在Websocket中使用频道

时间:2018-08-06 01:07:52

标签: go websocket

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

GET请求中,它从h.Message返回func home 通过在代码中添加任何渠道,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)
    }
}

1 个答案:

答案 0 :(得分:5)

未缓冲的通道本质上是阻塞的,即写入通道(hom.ch <- "message sent")和从通道(fmt.Println(<-h.ch)读取)阻塞了例程。

在您的情况下,http服务器未运行,因为hom.ch <- "message sent"阻止了执行。这就是GET请求无法正常工作的原因。

一种简单的解决方案是改为使其成为缓冲通道。