go搭建chatroom

大概记录一下计网大作业的一些事

刚好想学一门新的语言然后就选择了用go搭建一个在线聊天室

可能还没有对go了解比较深,所以对go的感觉只有一个(erro处理太麻烦:sob:)

项目地址丢在了:https://github.com/cyny666/chatroom

主要是通过websocket协议然后实现聊天室的一个用户端和服务器端,用户端是用js实现的,服务器端是用go实现的,这里吐槽一下两种语言的调试是真的麻烦

记录一个解决了几个小时出现的bug(也是找了好久)

服务器端的代码部分如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private_message := Message{
Type: "text",
Content: fmt.Sprintf("%s%s", "(私聊)"+nickname_message.Content, ":") + string(message.Content),
}
json_private, err := json.Marshal(private_message)
if err != nil {
log.Println("JSON编组错误:", err)
// 根据情况处理错误,例如返回或记录并继续
continue
}

for _, u := range users {
if u.Name == message.Type || u.ID == userID {
// 使用WriteMessage发送字节数组而非WriteJSON
err := u.Conn.WriteJSON(json_private)
if err != nil {
log.Println("发送消息错误:", err)
}
log.Println(string(json_private))
}
}

这里主要是加了一个私聊的功能,但是在客户方面返回的结果如下

就很奇怪预期的data应该是一个json结构的式子,后面把u.Conn.WriteJSON(json_private)改为WriteMessage即可解决问题了

然后开始去找问题的出现,发现google搜索无果于是去找源码了,经过大佬点拨发现这个

JSON的加密时Marshal

Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON value.

指的是[]byte会被base64编码

把data base64解码后得到

妈的想了半天终于懂了

我是先用json编码 json_private, err := json.Marshal(private_message)

这里的json_private为二进制数据,然后这里的string(json_private)也是正确的

然后直接用WriteJSON会有问题,然后用WriteMessage应该是会自动进行string转化的

WriteJSON writes the JSON encoding of v as a message.

WriteJSON调用了一次Marshal所以会把byte[]给搞成base64加密