Skip to content

Commit

Permalink
other: v2 server 增加 kcp 网络支持
Browse files Browse the repository at this point in the history
  • Loading branch information
kercylan98 committed May 2, 2024
1 parent 831833d commit 7121b8b
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 12 deletions.
13 changes: 7 additions & 6 deletions server/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,13 @@ func newConn(srv *server, c net.Conn, connWriter ConnWriter) *conn {
}

type conn struct {
server *server // 连接所属服务器
conn net.Conn // 连接
writer ConnWriter // 写入器
queue atomic.Pointer[string] // Actor 名称
ctx context.Context // 连接上下文
cancel context.CancelFunc // 连接上下文取消函数
descriptor ConnDescriptor // 连接描述符
server *server // 连接所属服务器
conn net.Conn // 连接
writer ConnWriter // 写入器
queue atomic.Pointer[string] // Actor 名称
ctx context.Context // 连接上下文
cancel context.CancelFunc // 连接上下文取消函数

// 写分离队列相关
state int32 // 连接状态
Expand Down
29 changes: 29 additions & 0 deletions server/conn_descriptor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package server

const (
connDescriptorInvalidReadDeadline ConnDescriptor = 1 << iota // 无效的读取截止时间
connDescriptorInvalidWriteDeadline // 无效的写入截止时间
)

// ConnDescriptor 实现 BitSet 实现的连接描述符,用于标识连接部分信息
type ConnDescriptor uint64

// has 判断是否包含指定的标识
func (c *ConnDescriptor) has(flag ConnDescriptor) bool {
return *c&flag != 0
}

// set 设置指定的标识
func (c *ConnDescriptor) set(flag ConnDescriptor) {
*c |= flag
}

// SetInvalidReadDeadline 设置无效的读取截止时间
func (c *ConnDescriptor) SetInvalidReadDeadline() {
c.set(connDescriptorInvalidReadDeadline)
}

// SetInvalidWriteDeadline 设置无效的写入截止时间
func (c *ConnDescriptor) SetInvalidWriteDeadline() {
c.set(connDescriptorInvalidWriteDeadline)
}
6 changes: 3 additions & 3 deletions server/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ type Controller interface {
// GetServer 获取服务器
GetServer() Server
// RegisterConnection 注册连接
RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn))
RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn, descriptor *ConnDescriptor))
// EliminateConnection 消除连接
EliminateConnection(conn net.Conn, err error)
// ReactPacket 反应连接数据包
Expand Down Expand Up @@ -41,12 +41,12 @@ func (s *controller) GetAnts() *ants.Pool {
return s.server.ants
}

func (s *controller) RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn)) {
func (s *controller) RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn, descriptor *ConnDescriptor)) {
s.server.PublishSyncMessage(s.getSysQueue(), func(ctx context.Context) {
c := newConn(s.server, conn, writer)
s.server.connections[conn] = c
if callback != nil {
callback(c)
callback(c, &c.descriptor)
}
s.events.onConnectionOpened(c)
})
Expand Down
4 changes: 3 additions & 1 deletion server/network/gnet_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ func (t *gNetGenericHandler) OnOpen(c gnet.Conn) (out []byte, action gnet.Action
t.controller.OnConnectionAsyncWriteError(c.Context().(server.Conn), packet, err)
return nil
})
}, func(conn server.Conn) {
}, func(conn server.Conn, descriptor *server.ConnDescriptor) {
c.SetContext(conn)
descriptor.SetInvalidWriteDeadline()
descriptor.SetInvalidReadDeadline()
})
return
}
Expand Down
2 changes: 1 addition & 1 deletion server/network/kcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (k *kcpCore) OnRun() error {
k.controller.OnConnectionAsyncWriteError(srvConn, packet, err)
}
return
}, func(conn server.Conn) {
}, func(conn server.Conn, descriptor *server.ConnDescriptor) {
srvConn = conn
},
)
Expand Down
5 changes: 4 additions & 1 deletion server/network/websocket.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@ func (w *websocketHandler) OnTraffic(c gnet.Conn) (action gnet.Action) {
// 协议升级成功后视为连接建立
w.controller.RegisterConnection(c, func(packet server.Packet) error {
return wsutil.WriteServerMessage(c, packet.GetContext().(ws.OpCode), packet.GetBytes())
}, nil)
}, func(conn server.Conn, descriptor *server.ConnDescriptor) {
descriptor.SetInvalidWriteDeadline()
descriptor.SetInvalidReadDeadline()
})
}); err != nil {
return gnet.Close
}
Expand Down

0 comments on commit 7121b8b

Please sign in to comment.