package server import ( "context" "fmt" "github.com/gorilla/websocket" "runtime/debug" "sonet/internal/gateway_ws/session" "sonet/pkg/grpc/generic" "sonet/pkg/protocol" "sonet/pkg/utils/logger" ) type ConnHandler struct { grpcFactory *generic.GrpcGenericClientFactory } func NewConnHandler(grpcFactory *generic.GrpcGenericClientFactory) *ConnHandler { return &ConnHandler{ grpcFactory: grpcFactory, } } func (c *ConnHandler) handleConn(conn *websocket.Conn) { client := session.NewNetClient(conn, ReadDeadline, WriteDeadline) defer func() { // 捕获其他错误 if r := recover(); r != nil { logger.Error("NetClient recover error: ", r) // 输出堆栈信息 logger.Error("NetClient recover error stack: ", string(debug.Stack())) } }() defer client.Close() for { message, err := client.ReadMessage() if err != nil { // TODO 连接关闭,mq发送关闭事件 if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { logger.Error("unexpected close error: ", err) } else { // 读失败 logger.Errorf("NetClient ReadMessage error: %T, %v", err, err) } return } payload, err := protocol.Decode(message) if err != nil { logger.Errorf("decode message error: len=%d", len(message), err) return } fmt.Printf("%v\n", payload) // grpc generic call ctx := context.Background() grpcClient, err := c.grpcFactory.GetClient(ctx, payload.Header.Svc) if err != nil { logger.Error("get grpc generic client error: ", err) continue } resp, err := grpcClient.InvokeUnary(ctx, payload.Header.Target, payload.Body) if err != nil { logger.Error("grpc generic call error: ", err) continue } fmt.Println(resp) // write response payload.Header.Type = protocol.TypeResponse payload.Header.Svc = "" payload.Header.Target = "" payload.Body, err = resp.Marshal() if err != nil { logger.Error("generic call response marshal error: ", err) continue } resMessage, err := protocol.Encode(payload) if err != nil { logger.Error("grpc generic call error: ", err) continue } client.MustWrite(resMessage) } }