上一节中,我们为每个连接都创建了一个goroutine来读取其中的消息,现在我们将这个读取消息的方法实现一下。
我们在application目录下新建controllers目录,并在其中创建一个MessageController.go文件。
首先我们新建一个MessageController的结构体,内容如下
type MessageController struct {
Index int
Conn *websocket.Conn
}
这个结构体包括两个内容,一个是我们将连接放在数组之后,返回的索引,另一个是连接本身.
func (m *MessageController) GetMessage() {
defer m.CloseWebSocket()
//读大小限制
m.Conn.SetReadLimit(maxMessageSize)
//读超时时间 这里设置为永不超时 time.Time{}
m.Conn.SetReadDeadline(time.Time{})
// 超时操作
m.Conn.SetPongHandler(func(string) error { m.Conn.SetReadDeadline(time.Time{}); return nil })
for {
_, msg, err := m.Conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
logs.Error("error: %v", err)
}
break
}
umsg := common.UserMessage{
Type: "",
UserId: 0,
FirstTopic: 0,
SecondTopic: 0,
}
fmt.Println("msg==============", msg)
err = json.Unmarshal([]byte(msg), &umsg)
if err != nil {
logs.Error("json unmarshal error:", err)
return
}
fmt.Println("umsg===============", umsg)
switch umsg.Type {
case "login":
loginService := services.LoginService{
Index: m.Index,
}
result := loginService.Register(umsg)
fmt.Println(result)
break
case "message":
fmt.Println("this is a message")
break
default:
fmt.Println("this is default")
break
}
}
}
这个是具体的方法。
我们首先设置了一下读消息的大小、超时时间以及超时后需要的操作。
超时时间如果设置为0,那么就是永不超时。之前在这里直接写0,被告知需要传一个time.Time类型的数据。最终谷歌后才得到了这个值time.Time{}为"0001-01-01 00:00:00 +0000 UTC"。
我们将用户手法消息的内容定义为一个结构体,然后将用户的订阅信息的json通过json.unmarshal转换成这个结构体。
之后的switch操作与我们在Swoole中的操作基本雷同,在查询到login之后,调用service中 的login方法来进行注册。
下一节中我们再介绍具体的注册逻辑。