登录
首页 >  Golang >  Go问答

使用 WebSocket 进行通信

来源:stackoverflow

时间:2024-03-15 16:50:11 412浏览 收藏

使用 WebSocket 进行通信时,在 `main` 函数或 `home` 处理函数中使用无缓冲通道会导致程序无法正常运行。这是因为无缓冲通道会阻塞程序执行,从而导致 HTTP 服务器无法启动,GET 请求也无法得到响应。 为了解决这个问题,可以将无缓冲通道替换为缓冲通道。缓冲通道允许在写入和读取操作之间进行缓冲,从而防止程序阻塞。

问题内容

如果我在 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)
    }
}

解决方案


无缓冲通道本质上是阻塞的,即写入通道(hom.ch <-“消息已发送”)并从通道读取(fmt.Println(<-h.ch))会阻塞 go-routine。

在您的情况下,http 服务器未运行,因为 hom.ch <-“消息已发送” 阻止执行。这就是 GET 请求不起作用的原因。

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

理论要掌握,实操不能落!以上关于《使用 WebSocket 进行通信》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>