diff --git a/main.go b/main.go index b49b787..4c8fc77 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main import "minotaur/server" func main() { - s := server.New(server.NetworkWebsocket) + s := server.New(server.NetworkKcp) s.Run(":9999") } diff --git a/server/conn.go b/server/conn.go index 4374c63..94aa611 100644 --- a/server/conn.go +++ b/server/conn.go @@ -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 } diff --git a/server/network.go b/server/network.go index a80d37c..a390183 100644 --- a/server/network.go +++ b/server/network.go @@ -12,4 +12,5 @@ const ( NetworkUnix Network = "unix" NetworkHttp Network = "http" NetworkWebsocket Network = "websocket" + NetworkKcp Network = "kcp" ) diff --git a/server/server.go b/server/server.go index 8620a9e..a9a7832 100644 --- a/server/server.go +++ b/server/server.go @@ -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 {