我已经打开了一个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?
答案 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
}
}
}