登录
首页 >  Golang >  Go问答

等待套接字连接和通道的同时

来源:stackoverflow

时间:2024-02-24 20:39:27 194浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《等待套接字连接和通道的同时》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我有一个 go 例程,需要等待套接字连接(来自客户端的传入消息),并且还有一个它同时读取的通道。不确定如何在 go 例程中做到这一点,或者是否可能?任何示例代码都将被应用。

我已经了解了如何在通道 https://gobyexample.com/non-blocking-channel-operations 上执行此操作,但我结合了 Websocket 和通道。

从这篇文章 https://github.com/gorilla/websocket/issues/122 来看,这似乎不可能(我使用的是 gorilla),但这是旧的,想知道是否有新的东西。


解决方案


要在 go 中同时等待两个事件流,您可以使用 select 语句,但它仅适用于通道。

因此,规范的解决方案是有一个 goroutine 从套接字读取(阻塞)并将数据放入通道中。然后您可以在该通道上与其他通道一起 select

伪代码:

// Want to wait on channel 'chan' and socket connection 'conn'

// sockCh is used to notify of new data arrived on the socket
sockCh := make(chan []byte)

// This goroutine listens on the socket and pushes all data it gets
// into sockCh.
go func() {
  for {
    buf := make([]byte, 2048)
    n, err := conn.Read(buf)
    if err != nil && err != io.EOF {
      log.Println("read error", err)
      return
    }
    if n == 0 {
      return
    }
    sockCh <- buf
  }
}()

select {
case buf := <-sockCh:
  // got buf from socket
case stuff := <-chan:
  // got stuff from channel
}

理论要掌握,实操不能落!以上关于《等待套接字连接和通道的同时》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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