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(); }
/// <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; }