Server support KCP
This commit is contained in:
parent
b0117a11ad
commit
3325e8ff44
2
main.go
2
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")
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -12,4 +12,5 @@ const (
|
|||
NetworkUnix Network = "unix"
|
||||
NetworkHttp Network = "http"
|
||||
NetworkWebsocket Network = "websocket"
|
||||
NetworkKcp Network = "kcp"
|
||||
)
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue