Server support KCP

This commit is contained in:
kercylan98 2023-04-19 19:30:01 +08:00
parent b0117a11ad
commit 3325e8ff44
4 changed files with 58 additions and 4 deletions

View File

@ -3,7 +3,7 @@ package main
import "minotaur/server"
func main() {
s := server.New(server.NetworkWebsocket)
s := server.New(server.NetworkKcp)
s.Run(":9999")
}

View File

@ -3,8 +3,20 @@ package server
import (
"github.com/gorilla/websocket"
"github.com/panjf2000/gnet"
"github.com/xtaci/kcp-go/v5"
)
func newKcpConn(session *kcp.UDPSession) *Conn {
return &Conn{
ip: session.RemoteAddr().String(),
kcp: session,
write: func(data []byte) error {
_, err := session.Write(data)
return err
},
}
}
func newGNetConn(conn gnet.Conn) *Conn {
return &Conn{
ip: conn.RemoteAddr().String(),
@ -28,6 +40,7 @@ type Conn struct {
ip string
ws *websocket.Conn
gn gnet.Conn
kcp *kcp.UDPSession
write func(data []byte) error
}
@ -40,6 +53,8 @@ func (slf *Conn) Close() {
slf.ws.Close()
} else if slf.gn != nil {
slf.gn.Close()
} else if slf.kcp != nil {
slf.kcp.Close()
}
slf.write = nil
}

View File

@ -12,4 +12,5 @@ const (
NetworkUnix Network = "unix"
NetworkHttp Network = "http"
NetworkWebsocket Network = "websocket"
NetworkKcp Network = "kcp"
)

View File

@ -5,6 +5,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"github.com/panjf2000/gnet"
"github.com/xtaci/kcp-go/v5"
"go.uber.org/zap"
"minotaur/utils/log"
"net/http"
@ -44,9 +45,10 @@ type Server struct {
// server.NetworkUDP (addr:":8888")
// server.NetworkUDP4 (addr:":8888")
// server.NetworkUDP6 (addr:":8888")
// server.Unix (addr:"socketPath")
// server.Http (addr:":8888")
// server.Websocket (addr:":8888/ws")
// server.NetworkUnix (addr:"socketPath")
// server.NetworkHttp (addr:":8888")
// server.NetworkWebsocket (addr:":8888/ws")
// server.NetworkKcp (addr:":8888")
func (slf *Server) Run(addr string) error {
if slf.event == nil {
return ErrConstructed
@ -72,6 +74,41 @@ func (slf *Server) Run(addr string) error {
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
}
}()
case NetworkKcp:
listener, err := kcp.ListenWithOptions(slf.addr, nil, 0, 0)
if err != nil {
return err
}
go connectionInitHandle()
go func() {
for {
session, err := listener.AcceptKCP()
if err != nil {
continue
}
conn := newKcpConn(session)
slf.OnConnectionOpenedEvent(conn)
go func(conn *Conn) {
defer func() {
if err := recover(); err != nil {
conn.Close()
slf.OnConnectionClosedEvent(conn)
}
}()
buf := make([]byte, 4096)
for {
n, err := conn.kcp.Read(buf)
if err != nil {
panic(err)
}
slf.PushMessage(MessageTypePacket, conn, buf[:n])
}
}(conn)
}
}()
case NetworkHttp:
go func() {
if err := slf.httpServer.Run(addr); err != nil {
@ -109,6 +146,7 @@ func (slf *Server) Run(addr string) error {
conn := newWebsocketConn(ws)
conn.ip = ip
slf.OnConnectionOpenedEvent(conn)
defer func() {
if err := recover(); err != nil {