Beispiel #1
0
        /// <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;
            }
        }
Beispiel #2
0
        /// <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);
        }