/// <summary> /// 接收请求处理 /// </summary> /// <param name="transmit">传输对象</param> private async void ReceiveRequestHandler(Transmit transmit) { switch (transmit.Parameter) { case "Client;AddSocket": SocketResult socketResult = await socketManager.CreateConnectionAsync(); if (socketResult != null) { switch (socketResult.State) { case ConnectionState.Success: Task task = Task.Run(() => SecondaryReceiver(socketResult.Socket)); break; case ConnectionState.Failed: break; case ConnectionState.Timeout: break; case ConnectionState.Error: break; } } break; case "Client;RequestResult": RequestResult requestResult = transmit.Object as RequestResult; if (requestResult != null) { ClientRequestResult?.Invoke(this, new RequestResultEventArgs(requestResult)); } break; } }
/// <summary> /// 异步的发送文件。如果发送成功返回true,否则返回false /// </summary> /// <param name="targetUserID">目标ID</param> /// <param name="filePath">文件路径</param> public async Task <bool> SendFileAsync(string targetUserID, string filePath) { if (ClientState && targetUserID != null && filePath != null) { return(await Task.Run <bool>(async() => { FileStream fileStream = null; //文件流 byte[] dataBuffer = new byte[1024 * 1024]; //数据缓冲区 try { fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); if (fileStream.Length == 0) { return false; } byte[] buffer = BytesConvert.ObjectToBytes(new Transmit() { SourceID = ClientID, TargetID = targetUserID, DataType = DataType.File, Parameter = $"{Path.GetFileName(filePath)};{fileStream.Length}" }); SocketResult socketResult = await socketManager.CreateConnectionAsync(); switch (socketResult.State) { case ConnectionState.Success: socketResult.Socket.Send(buffer, buffer.Length, SocketFlags.None); break; case ConnectionState.Failed: throw new ArgumentException("服务器拒绝连接"); case ConnectionState.Timeout: throw new ArgumentException("服务器连接超时"); case ConnectionState.Error: throw socketResult.Exception; } Thread.Sleep(5000); while (true) { int readBytes = fileStream.Read(dataBuffer, 0, dataBuffer.Length); if (readBytes <= 0) { break; } socketResult.Socket.Send(dataBuffer, readBytes, SocketFlags.None); Thread.Sleep(10); } } catch (Exception exception) { ClientError?.Invoke(this, new ClientErrorEventArgs(exception, "在发送文件时发生错误")); return false; } finally { fileStream?.Close(); fileStream?.Dispose(); fileStream = null; } return true; })); } return(false); }