问题
我需要一些帮助与类型在Golang,我得到超级困惑。我正在尝试更改Gorilla的websocket聊天示例,我想传入JSON并相应地处理它。例如,我需要能够设置一个用户,并向websocket发送消息。
在当前的实现中,它所做的只是接收一个字符串,并通过将其广播给所有连接的客户端来将其中继回来。
例如,我希望能够按如下方式设置数据结构,并以不同的方式处理它。
传入用户为:
{
'type': "user",
'value': "John Doe"
}
传入消息为:
{
'type': "message",
'value': "Hi There, how are you?"
}
请参考以下代码:https://github.com/gorilla/websocket/blob/master/examples/chat/conn.go#L52
for {
_, message, err := c.ws.ReadMessage()
if err != nil {
break
}
h.broadcast <- message
}
数据
因此,上面的代码适用于单个字符串,因为服务器所做的只是将来自任何客户端的传入消息传递给所有客户端。但我希望能够保存用户,并将活动用户列表与新消息一起发送回客户端。
要做到这一点,在我看来,我需要以不同的方式处理不同的传入消息。我试着解开插入的message
,但当我打印出类型时,它是这样的:
2015/11/24 20:03:10 []uint8
问题
如何读取这个输入流,并将其分解为JSON?这是我添加到部分的调试:
for {
_, dataString, err := c.ws.ReadMessage()
if err != nil {
break
}
log.Println(reflect.TypeOf(dataString))
var data MessageData
err = json.Unmarshal(dataString, &data)
log.Println(data.Type)
log.Println(data.Value)
if err != nil {
log.Println(err)
}
h.broadcast <- dataString
}
哪个返回
2015/11/24 20:03:10 []uint8
2015/11/24 20:03:10
2015/11/24 20:03:10
对不起,我在这方面有点笨。message
已经是一个字节类型的接口。在将数据发送到后端之前,我没有在HTML/JavaScript前端对数据进行正确编码。
起作用的是在前端对其进行串接:
var data = {};
data.type = "user";
data.value = user.val();
conn.send(JSON.stringify(data));
JSON.stringify(data)
然后我就可以解组JSON:
2015/11/24 20:36:04 {user fhgfhg}
2015/11/24 20:36:04 user
2015/11/24 20:36:04 fhgfhg