101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
|
|
package websocketServer
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"github.com/gorilla/websocket"
|
|||
|
|
"net/http"
|
|||
|
|
webServer "Framework/webServer"
|
|||
|
|
"strconv"
|
|||
|
|
"sync"
|
|||
|
|
"testing"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 处理HTTP请求
|
|||
|
|
func httpHandler(cxt *webServer.Context) {
|
|||
|
|
msg := "test msg"
|
|||
|
|
cxt.GetResponseWriter().Write([]byte(msg))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// websocket连接事件
|
|||
|
|
func onConnFunc(ctx *Context) {
|
|||
|
|
fmt.Printf("new conn, ip: %s %p\n", ctx.GetWebServerContext().GetRequestIP(), ctx)
|
|||
|
|
ctx.SendMessage(websocket.TextMessage, []byte("Hello")) // 返回数据
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// websocket关闭事件
|
|||
|
|
func onCloseFunc(ctx *Context) {
|
|||
|
|
fmt.Printf("close conn, ip: %s %p\n", ctx.GetWebServerContext().GetRequestIP(), ctx)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// websocket接收事件
|
|||
|
|
func onMsgFunc(ctx *Context, msgType int, msgData []byte) {
|
|||
|
|
fmt.Printf("%p ", ctx)
|
|||
|
|
fmt.Println("msg ip:", ctx.GetWebServerContext().GetRequestIP(), "msg type:", msgType, "msg:", string(msgData))
|
|||
|
|
ctx.SendMessage(msgType, []byte("SVR: "+string(msgData))) // 返回数据
|
|||
|
|
|
|||
|
|
// 主动关闭连接测试
|
|||
|
|
if string(msgData) == "close" {
|
|||
|
|
ctx.SendMessage(msgType, []byte("close")) // 返回数据
|
|||
|
|
//time.Sleep(time.Microsecond * 100)
|
|||
|
|
ctx.Close()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func TestWsServer(t *testing.T) {
|
|||
|
|
var ssl bool = false
|
|||
|
|
var server IServer
|
|||
|
|
if ssl {
|
|||
|
|
server = NewWssServer(":22222", "cert.pem", "key.pem", false)
|
|||
|
|
} else {
|
|||
|
|
server = NewWsServer(":22222", false)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
server.SetIfDelegate(false)
|
|||
|
|
|
|||
|
|
// 注册HTTP处理函数
|
|||
|
|
server.RegisterHandler("/http", httpHandler, &webServer.HandlerConfig{})
|
|||
|
|
|
|||
|
|
// 设置websocket允许跨域访问
|
|||
|
|
server.GetUpgrader().CheckOrigin = func(r *http.Request) bool {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
//upgrader := &websocket.Upgrader{
|
|||
|
|
// // 允许跨域
|
|||
|
|
// CheckOrigin: func(r *http.Request) bool {
|
|||
|
|
// return true
|
|||
|
|
// },
|
|||
|
|
//}
|
|||
|
|
//server.SetUpgrader(upgrader)
|
|||
|
|
|
|||
|
|
// 注册websocket处理事件
|
|||
|
|
server.RegisterWebsocketHandler("/websocket", &EventCallbackFuncs{
|
|||
|
|
OnConnFunc: onConnFunc,
|
|||
|
|
OnCloseFunc: onCloseFunc,
|
|||
|
|
OnMsgFunc: onMsgFunc,
|
|||
|
|
}, &webServer.HandlerConfig{})
|
|||
|
|
|
|||
|
|
// 设置广播并发数
|
|||
|
|
server.SetBroadcastConcurrent(2)
|
|||
|
|
|
|||
|
|
// 设置接收到Ping消息时,自动回复Pong信息
|
|||
|
|
server.SetAutoPong(true)
|
|||
|
|
|
|||
|
|
// 设置心跳检测信息(心跳检测周期10秒;缺少2个心跳周期断开连接)
|
|||
|
|
server.SetHeartbeatDetectInfo(2, time.Second*10)
|
|||
|
|
|
|||
|
|
// 广播测试
|
|||
|
|
go func() {
|
|||
|
|
var i = 0
|
|||
|
|
for {
|
|||
|
|
time.Sleep(time.Second * 10)
|
|||
|
|
// 广播测试
|
|||
|
|
server.BroadcastMessage(websocket.TextMessage, []byte(strconv.Itoa(i)))
|
|||
|
|
i++
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
wg := sync.WaitGroup{}
|
|||
|
|
server.Start(&wg)
|
|||
|
|
}
|