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"
|
import "minotaur/server"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := server.New(server.NetworkWebsocket)
|
s := server.New(server.NetworkKcp)
|
||||||
|
|
||||||
s.Run(":9999")
|
s.Run(":9999")
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,20 @@ package server
|
||||||
import (
|
import (
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/panjf2000/gnet"
|
"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 {
|
func newGNetConn(conn gnet.Conn) *Conn {
|
||||||
return &Conn{
|
return &Conn{
|
||||||
ip: conn.RemoteAddr().String(),
|
ip: conn.RemoteAddr().String(),
|
||||||
|
@ -28,6 +40,7 @@ type Conn struct {
|
||||||
ip string
|
ip string
|
||||||
ws *websocket.Conn
|
ws *websocket.Conn
|
||||||
gn gnet.Conn
|
gn gnet.Conn
|
||||||
|
kcp *kcp.UDPSession
|
||||||
write func(data []byte) error
|
write func(data []byte) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +53,8 @@ func (slf *Conn) Close() {
|
||||||
slf.ws.Close()
|
slf.ws.Close()
|
||||||
} else if slf.gn != nil {
|
} else if slf.gn != nil {
|
||||||
slf.gn.Close()
|
slf.gn.Close()
|
||||||
|
} else if slf.kcp != nil {
|
||||||
|
slf.kcp.Close()
|
||||||
}
|
}
|
||||||
slf.write = nil
|
slf.write = nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,4 +12,5 @@ const (
|
||||||
NetworkUnix Network = "unix"
|
NetworkUnix Network = "unix"
|
||||||
NetworkHttp Network = "http"
|
NetworkHttp Network = "http"
|
||||||
NetworkWebsocket Network = "websocket"
|
NetworkWebsocket Network = "websocket"
|
||||||
|
NetworkKcp Network = "kcp"
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/panjf2000/gnet"
|
"github.com/panjf2000/gnet"
|
||||||
|
"github.com/xtaci/kcp-go/v5"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"minotaur/utils/log"
|
"minotaur/utils/log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -44,9 +45,10 @@ type Server struct {
|
||||||
// server.NetworkUDP (addr:":8888")
|
// server.NetworkUDP (addr:":8888")
|
||||||
// server.NetworkUDP4 (addr:":8888")
|
// server.NetworkUDP4 (addr:":8888")
|
||||||
// server.NetworkUDP6 (addr:":8888")
|
// server.NetworkUDP6 (addr:":8888")
|
||||||
// server.Unix (addr:"socketPath")
|
// server.NetworkUnix (addr:"socketPath")
|
||||||
// server.Http (addr:":8888")
|
// server.NetworkHttp (addr:":8888")
|
||||||
// server.Websocket (addr:":8888/ws")
|
// server.NetworkWebsocket (addr:":8888/ws")
|
||||||
|
// server.NetworkKcp (addr:":8888")
|
||||||
func (slf *Server) Run(addr string) error {
|
func (slf *Server) Run(addr string) error {
|
||||||
if slf.event == nil {
|
if slf.event == nil {
|
||||||
return ErrConstructed
|
return ErrConstructed
|
||||||
|
@ -72,6 +74,41 @@ func (slf *Server) Run(addr string) error {
|
||||||
slf.PushMessage(MessageTypeError, err, MessageErrorActionShutdown)
|
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:
|
case NetworkHttp:
|
||||||
go func() {
|
go func() {
|
||||||
if err := slf.httpServer.Run(addr); err != nil {
|
if err := slf.httpServer.Run(addr); err != nil {
|
||||||
|
@ -109,6 +146,7 @@ func (slf *Server) Run(addr string) error {
|
||||||
|
|
||||||
conn := newWebsocketConn(ws)
|
conn := newWebsocketConn(ws)
|
||||||
conn.ip = ip
|
conn.ip = ip
|
||||||
|
slf.OnConnectionOpenedEvent(conn)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
|
|
Loading…
Reference in New Issue