feat: 支持对 server.Conn 写入时调用带有 Callback 的写入函数
新增 server.Conn.WriteWithCallback() 和 server.Conn.WriteStringWithCallback()
This commit is contained in:
parent
e0571c7ed1
commit
47175660de
|
@ -137,6 +137,12 @@ func (slf *Conn) WriteString(data string, messageType ...int) {
|
||||||
slf.Write([]byte(data), messageType...)
|
slf.Write([]byte(data), messageType...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteStringWithCallback 与 WriteString 相同,但是会在写入完成后调用 callback
|
||||||
|
// - 当 callback 为 nil 时,与 WriteString 相同
|
||||||
|
func (slf *Conn) WriteStringWithCallback(data string, callback func(err error), messageType ...int) {
|
||||||
|
slf.WriteWithCallback([]byte(data), callback, messageType...)
|
||||||
|
}
|
||||||
|
|
||||||
// Write 向连接中写入数据
|
// Write 向连接中写入数据
|
||||||
// - messageType: websocket模式中指定消息类型
|
// - messageType: websocket模式中指定消息类型
|
||||||
func (slf *Conn) Write(data []byte, messageType ...int) {
|
func (slf *Conn) Write(data []byte, messageType ...int) {
|
||||||
|
@ -153,6 +159,23 @@ func (slf *Conn) Write(data []byte, messageType ...int) {
|
||||||
slf.mutex.Unlock()
|
slf.mutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteWithCallback 与 Write 相同,但是会在写入完成后调用 callback
|
||||||
|
// - 当 callback 为 nil 时,与 Write 相同
|
||||||
|
func (slf *Conn) WriteWithCallback(data []byte, callback func(err error), messageType ...int) {
|
||||||
|
if slf.packetPool == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cp := slf.packetPool.Get()
|
||||||
|
if len(messageType) > 0 {
|
||||||
|
cp.websocketMessageType = messageType[0]
|
||||||
|
}
|
||||||
|
cp.packet = data
|
||||||
|
cp.callback = callback
|
||||||
|
slf.mutex.Lock()
|
||||||
|
slf.packets = append(slf.packets, cp)
|
||||||
|
slf.mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
// writeLoop 写循环
|
// writeLoop 写循环
|
||||||
func (slf *Conn) writeLoop(wait *sync.WaitGroup) {
|
func (slf *Conn) writeLoop(wait *sync.WaitGroup) {
|
||||||
slf.packetPool = synchronization.NewPool[*connPacket](10*1024,
|
slf.packetPool = synchronization.NewPool[*connPacket](10*1024,
|
||||||
|
@ -161,6 +184,7 @@ func (slf *Conn) writeLoop(wait *sync.WaitGroup) {
|
||||||
}, func(data *connPacket) {
|
}, func(data *connPacket) {
|
||||||
data.packet = nil
|
data.packet = nil
|
||||||
data.websocketMessageType = 0
|
data.websocketMessageType = 0
|
||||||
|
data.callback = nil
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -210,10 +234,15 @@ func (slf *Conn) writeLoop(wait *sync.WaitGroup) {
|
||||||
_, err = slf.kcp.Write(data.packet)
|
_, err = slf.kcp.Write(data.packet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
callback := data.callback
|
||||||
slf.packetPool.Release(data)
|
slf.packetPool.Release(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if callback != nil {
|
||||||
|
callback(err)
|
||||||
|
} else {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,4 +3,5 @@ package server
|
||||||
type connPacket struct {
|
type connPacket struct {
|
||||||
websocketMessageType int
|
websocketMessageType int
|
||||||
packet []byte
|
packet []byte
|
||||||
|
callback func(err error)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue