http.Handle(" /",websocket.Handler(EchoServer)EchoServer可以获取除ws之外的其他参数吗?

时间:2014-05-21 10:25:07

标签: websocket go

我已经打开了一个websocket服务器来向web组件发送数据,

func WebSocketServer() {
    http.Handle("/", websocket.Handler(Echoserver))
    err := http.ListenAndServe(":8081", nil)
    CheckError(err)
}

我想将一个附加参数(msg,类型为String)传递给handlerfunction(Echoserver)。

func Echoserver(ws *websocket.Conn, msg String) {
    fmt.Println("Client Connected")
         _ := websocket.JSON.Send(ws, msg);
    }
}

是否可以使用上述语法执行此操作? 你如何用附加参数调用Echoserver?

2 个答案:

答案 0 :(得分:5)

我假设你想要的是一个一致的string参数,它为/的所有连接返回。我使用过几种方法。 (这些特定代码示例都没有经过测试;如果不编译,我可以提取一些实际代码。)

一个是让数据成为接收者。我最经常使用这个结构,但任何参数都可以。这仅适用于单个参数(但您当然可以在结构中放置多个参数)。当参数是“像对象”时,我喜欢这种方法。 (通常是一个包含其他方法的结构。)

type echoStuff string

var hey echoStuff = "Hey!"

http.Handle("/", websocket.Handler(hey.EchoServer))
err := http.ListenAndServe(":8081", nil)
CheckError(err)

func (msg echoStuff) Echoserver(ws *websocket.Conn) {
  fmt.Println("Client Connected")
   _ := websocket.JSON.Send(ws, msg);
}

另一种方法是关闭。当参数是“数据类似”时,我喜欢这种方法。 (类似于字符串或其他简单数据。注意这种方法不需要创建本地类型。)

func WebSocketServer() {
  http.Handle("/", echoHandler("Hey!"))
  err := http.ListenAndServe(":8081", nil)
  CheckError(err)
}

func echoHandler(msg string) websocket.Handler {
  return func(ws *Conn) {
    Echoserver(ws, msg)
  }
}

答案 1 :(得分:1)

由于 websocket.Handler 期望具有特定签名的函数,因此您无法以该方式传递参数。

func(*Conn)

这可能是需要频道的情况 见this example for instance

首先,您的处理函数创建一个频道:

yourHandlerFunction := func(ws *websocket.Conn) {
  client := NewClient(ws, self)
  self.addClient <- client
  client.Listen()
  defer ws.Close()
}

(此处,"Client" is a struct包含一个频道和指向websocket.Conn的指针

然后服务器等待新客户端,并以这样的方式传递消息:

for {
  select {

    // Add new a client
    case c := <-self.addClient:
      log.Println("Added new client")
      self.clients = append(self.clients, c)
      for _, msg := range self.messages {
        c.Write() <- msg
    }

最后,Client can receive the message,然后进行JSON调用:

// Listen write request via chanel
func (self *Client) listenWrite() {
  log.Println("Listening write to client")
  for {
    select {

      // send message to the client
      case msg := <-self.ch:
        log.Println("Send:", msg)
        websocket.JSON.Send(self.ws, msg)

      // receive done request
      case <-self.done:
        self.server.RemoveClient() <- self
        self.done <- true // for listenRead method
      return
    }
  }
}