示例#1
0
    private void SocketConfig(IWebSocketConnection socket)
    {
        //接收事件处理
        //获取请求头数据
        if (!socket.ConnectionInfo.Headers.TryGetValue("X-Self-ID", out string selfId) || //bot UID
            !socket.ConnectionInfo.Headers.TryGetValue("X-Client-Role", out string role)) //Client Type
        {
            return;
        }

        //请求路径检查
        bool isLost = role switch
        {
            "Universal" => !socket.ConnectionInfo.Path.Trim('/').Equals(Config.UniversalPath.Trim('/')),
            _ => true
        };

        if (isLost)
        {
            socket.Close();
            Log.Warning("Sora",
                        $"关闭与未知客户端的连接[{socket.ConnectionInfo.ClientIpAddress}:{socket.ConnectionInfo.ClientPort}],请检查是否设置正确的监听地址");
            return;
        }

        //打开连接
        socket.OnOpen = () =>
        {
            if (_disposed)
            {
                return;
            }
            //获取Token
            if (socket.ConnectionInfo.Headers.TryGetValue("Authorization",
                                                          out string headerValue))
            {
                string token = headerValue.Split(' ')[1];
                Log.Debug("Server", $"get token = {token}");
                //验证Token
                if (!token.Equals(Config.AccessToken))
                {
                    return;
                }
            }

            //向客户端发送Ping
            socket.SendPing(new byte[] { 1, 2, 5 });
            //事件回调
            ConnManager.OpenConnection(role, selfId, new ServerSocket(socket), _serverId,
                                       socket.ConnectionInfo.Id, Config.ApiTimeOut);
            Log.Info("Sora",
                     $"已连接客户端[{socket.ConnectionInfo.ClientIpAddress}:{socket.ConnectionInfo.ClientPort}]");
        };
        //关闭连接
        socket.OnClose = () =>
        {
            if (_disposed)
            {
                return;
            }
            //移除原连接信息
            if (ConnectionManager.ConnectionExists(socket.ConnectionInfo.Id))
            {
                ConnManager.CloseConnection(role, Convert.ToInt64(selfId),
                                            socket.ConnectionInfo.Id);
            }

            Log.Info("Sora",
                     $"客户端连接被关闭[{socket.ConnectionInfo.ClientIpAddress}:{socket.ConnectionInfo.ClientPort}]");
        };
        //上报接收
        socket.OnMessage = message =>
                           Task.Run(() =>
        {
            if (_disposed)
            {
                return;
            }
            Event.Adapter(JObject.Parse(message), socket.ConnectionInfo.Id);
        });
    }

    /// <summary>
    /// GC析构函数
    /// </summary>
    ~SoraWebsocketServer()
    {
        Dispose();
    }
示例#2
0
    /// <summary>
    /// 启动客户端并自动连接服务器
    /// </summary>
    private async ValueTask StartClient()
    {
        if (!_clientReady)
        {
            return;
        }
        //消息接收事件
        Client.MessageReceived.Subscribe(msg => Task.Run(() =>
        {
            if (_disposed)
            {
                return;
            }
            Event.Adapter(JObject.Parse(msg.Text), _clientId);
        }));
        //连接断开事件
        Client.DisconnectionHappened
        .Subscribe(info => Task.Run(() =>
        {
            if (_disposed)
            {
                return;
            }
            ConnectionManager.GetLoginUid(_clientId, out long uid);
            //移除原连接信息
            if (ConnectionManager.ConnectionExists(_clientId))
            {
                ConnManager.CloseConnection("Universal", uid, _clientId);
            }

            if (info.Exception != null)
            {
                Log.Error("Sora",
                          $"监听服务器时发生错误{Log.ErrorLogBuilder(info.Exception)}");
            }
            else
            {
                Log.Info("Sora", "服务器连接被关闭");
            }
        }));
        //重连事件
        Client.ReconnectionHappened
        .Subscribe(info => Task.Run(() =>
        {
            if (_disposed)
            {
                return;
            }
            if (info.Type == ReconnectionType.Initial || !_clientIsRunning)
            {
                return;
            }
            Log.Info("Sora", $"服务器已自动重连{info.Type}");
            ConnManager.OpenConnection("Universal", "0", new ClientSocket(Client),
                                       _clientId, _clientId,
                                       Config.ApiTimeOut);
        }));
        //开始客户端
        await Client.Start();

        ConnManager.StartTimer(_clientId);
        if (!Client.IsRunning || !Client.IsStarted)
        {
            throw new WebSocketClientException("WebSocket client is not running");
        }

        ConnManager.OpenConnection("Universal", "0", new ClientSocket(Client), _clientId, _clientId,
                                   Config.ApiTimeOut);
        Log.Info("Sora", "Sora WebSocket客户端正在运行并已连接至onebot服务器");
        _clientIsRunning = true;
    }