当前位置: 首页 > 面试题库 >

GO Websocket向所有客户发送消息

亢奇
2023-03-14
问题内容

这段代码一切正常(将其缩短以便更好地阅读)。

Client1向服务器发送请求时,服务器会立即响应他。但是,其他客户端看不到响应消息。

因此,我想进一步说明:当客户端向服务器发送请求时,服务器将响应所有客户端,以便所有客户端都能看到消息

我怎样才能做到这一点?有任何示例或不错的入门教程吗?

提前致谢!

服务器:

import (
        "github.com/gorilla/websocket"
       )

func main() {
    http.Handle("/server", websocket.Handler(echoHandler)) 
}

func echoHandler(ws *websocket.Conn) {
    conn, err := upgrader.Upgrade(w, r, nil) 
    if err != nil { 
      return
    }
    for {
      messageType, p, err := conn.ReadMessage() 
      if err != nil {
        return
      }

      print_binary(p) // simple print of the message

      err = conn.WriteMessage(messageType, p);
      if err != nil {
        return
      }
    }
}

问题答案:

您必须使用连接池将消息广播到所有连接。您可以将其用作教程/示例http://gary.burd.info/go-websocket-
chat

简化:
连接池是已注册连接的集合。见hub.connections

type connection struct {
    // The websocket connection.
    ws *websocket.Conn

    // Buffered channel of outbound messages.
    send chan []byte

    // The hub.
    h *hub
}

type hub struct {
    // Registered connections. That's a connection pool
    connections map[*connection]bool

    ...
}

为了广播所有客户端的消息,我们在连接池上进行如下迭代:

    case m := <-h.broadcast:
        for c := range h.connections {
            select {
            case c.send <- m:
            default:
                delete(h.connections, c)
                close(c.send)
            }
        }
    }

h.broadcast在该示例中,是一个包含我们需要广播的消息的频道。
我们用default一节的select语句具有完全或阻止发送通道删除连接。



 类似资料:
  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示

  • 我刚开始使用Firebase云消息。我建了一个IOS应用来接收推送通知。应用程序运行良好。我从Firebase控制台发送消息,它们会正确显示。 我的问题是:我可以向所有设备发送一条消息吗(就像我可以在控制台中做的那样)?我是的,怎么会这样? 提前道谢!

  • 我后来理解对了。实际上,我需要一条来自android客户端的MQTT消息发送到所有其他客户端,所以我想在消息正文中包含publish关键字,这是非常错误的。MQTT本身将接收到的消息发送给所有提供的客户端,如果客户端订阅了该主题的话。

  • 我正在将我的“普通NIO”(=我直接使用了JDK中的软件包)TCP服务器迁移到Netty 4。 我有向所有客户端发送消息的线程,例如运行状况检查数据包,聊天消息广播,直接聊天消息到单个客户端,...使用我保留在某处集合。 我如何在Netty中做到这一点?在一个Netty处理程序和需要发送消息的线程之间共享一个ChannelGroup是否明智?该通道将如下所示: 在所有线程中,我将简单地执行以下操作

  • 问题内容: 我只能在用户的套接字ID直接存储在io.sockets.on(’connect’)函数中时向用户发出消息。我不知道为什么在登录后尝试存储其套接字ID时为什么不起作用。 加工: 无法运作: JavaScript客户端代码段 解决方案:感谢@alessioalex, 我不得不从登录页面中删除对socket.io的引用,并将以下内容添加到io.sockets.on(’connection’)

  • 我知道我们可以通过聊天聊天=muc2.create私人聊天(“myroom@conference.jabber.org /johndoe”);chat.send消息(“你好”);在留档中给出。 但是我没有找到公开和群里所有用户聊天的方法。任何想法? 提前谢谢。