1
0
mirror of https://github.com/Mrs4s/go-cqhttp.git synced 2025-05-05 03:23:49 +08:00

websocket read with buffer pool

This commit is contained in:
wdvxdr 2021-03-18 22:32:54 +08:00
parent 5e52cecd71
commit 3301077c46
No known key found for this signature in database
GPG Key ID: 55FF1414A69CEBA6
2 changed files with 28 additions and 6 deletions

View File

@ -128,7 +128,7 @@ func (e *PokeElement) Type() message.ElementType {
// ToArrayMessage 将消息元素数组转为MSG数组以用于消息上报 // ToArrayMessage 将消息元素数组转为MSG数组以用于消息上报
func ToArrayMessage(e []message.IMessageElement, id int64, isRaw ...bool) (r []MSG) { func ToArrayMessage(e []message.IMessageElement, id int64, isRaw ...bool) (r []MSG) {
r = []MSG{} r = make([]MSG, 0, len(e))
ur := false ur := false
if len(isRaw) != 0 { if len(isRaw) != 0 {
ur = isRaw[0] ur = isRaw[0]

View File

@ -179,13 +179,25 @@ func (c *WebSocketClient) connectUniversal() {
func (c *WebSocketClient) listenAPI(conn *webSocketConn, u bool) { func (c *WebSocketClient) listenAPI(conn *webSocketConn, u bool) {
defer conn.Close() defer conn.Close()
for { for {
_, buf, err := conn.ReadMessage() buffer := global.NewBuffer()
t, reader, err := conn.NextReader()
if err != nil { if err != nil {
log.Warnf("监听反向WS API时出现错误: %v", err) log.Warnf("监听反向WS API时出现错误: %v", err)
break break
} }
_, err = buffer.ReadFrom(reader)
go conn.handleRequest(c.bot, buf) if err != nil {
log.Warnf("监听反向WS API时出现错误: %v", err)
break
}
if t == websocket.TextMessage {
go func(buffer *bytes.Buffer) {
defer global.PutBuffer(buffer)
conn.handleRequest(c.bot, buffer.Bytes())
}(buffer)
} else {
global.PutBuffer(buffer)
}
} }
if c.conf.ReverseReconnectInterval != 0 { if c.conf.ReverseReconnectInterval != 0 {
time.Sleep(time.Millisecond * time.Duration(c.conf.ReverseReconnectInterval)) time.Sleep(time.Millisecond * time.Duration(c.conf.ReverseReconnectInterval))
@ -309,13 +321,23 @@ func (s *webSocketServer) any(w http.ResponseWriter, r *http.Request) {
func (s *webSocketServer) listenAPI(c *webSocketConn) { func (s *webSocketServer) listenAPI(c *webSocketConn) {
defer c.Close() defer c.Close()
for { for {
t, payload, err := c.ReadMessage() buffer := global.NewBuffer()
t, reader, err := c.NextReader()
if err != nil {
break
}
_, err = buffer.ReadFrom(reader)
if err != nil { if err != nil {
break break
} }
if t == websocket.TextMessage { if t == websocket.TextMessage {
go c.handleRequest(s.bot, payload) go func(buffer *bytes.Buffer) {
defer global.PutBuffer(buffer)
c.handleRequest(s.bot, buffer.Bytes())
}(buffer)
} else {
global.PutBuffer(buffer)
} }
} }
} }