private async void ReceiveImage(TcpPackage receivePackage) { var udpConfigPackage = receivePackage.Config; var remote = udpConfigPackage.ReceiveEndPoint.Split("|"); var remotePoint = new IPEndPoint(IPAddress.Parse(remote[0]), Convert.ToInt32(remote[1])); using (var udpClient = await new UdpClientManager().CreateUdpReceiveClientAsync(12000)) { var udpPackageManager = new UdpPackageManager(8); while (true) { var buffer = (await udpClient.ReceiveAsync()).Buffer; //var buffer = udpClient.Receive(ref remotePoint); ushort[] lostSlice; bool transferFinished; if (udpPackageManager.CollectSlices(buffer, out lostSlice, out transferFinished)) { if (!transferFinished) { // 只接收了一块数据就进行了显示操作 // 图片大小限定: 10M // 解决方案: 将图片缓存到本地, 再读取到程序中 // 缓存方案: 像文件一样按块写入本地, 最后再进行调用 // 缓存地址: 软件安装目录 var buff = udpPackageManager.SliceToBlock(udpPackageManager.GetSliceList(), 1).Result; if (buff != null) { Dispatcher.Invoke(() => { var bitmap = ImageHelper.BytesToBitmapImage(buff); ChatArea.Children.Add(new ReceiveControl(receivePackage, bitmap)); }); break; } } else { break; } //Thread.Sleep(10); } } //MessageBox.Show("Client回收"); } //udpClient.Client.Close(5000); }
async Task SendImage(string fileName, TcpPackage package) { using (var _sendUdpImageClient = new UdpClientManager()) { // 创建Udp客户端 //await _sendUdpImageClient.CreateUdpSendClientAsync(new IPEndPoint(IPAddress.Loopback, _sendUdpPort)); await _sendUdpImageClient.CreateUdpSendClientAsync(new IPEndPoint(IPAddress.Loopback, new Random().Next(40000, 50000))); var imagePackage = new TcpPackage() { OpCode = LbChatWith.Content.Equals("All") ? OpCode.All : OpCode.Single, MessageType = MessageType.Image, LocalName = TbUserName.Text, RemoteName = LbChatWith.Content.ToString() }; #region Tcp校验 丢弃 //_sendImageTcpClient = new EasyClient<TextPackageInfo>(new LinePipelineFilter(), options).AsClient(); //var connected = await _sendImageTcpClient.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 8888)); //var msg = imagePackage.ToString(); //await _sendImageTcpClient.SendAsync(Encoding.UTF8.GetBytes(msg)); //UdpConfigPackage package = null; //while (true) //{ // var data = await _sendImageTcpClient.ReceiveAsync(); // package = TcpPackage.JsonToPackage(data.Text).Config; // if (package != null) // { // break; // } // await Task.Delay(100); //} #endregion var point = package.Config.ReceiveEndPoint.Split("|"); if (!_sendUdpImageClient.Client.Connected) { _sendUdpImageClient.Connect(IPAddress.Parse(point[0]), Convert.ToInt32(point[1])); } // 发送Image var packageManager = new UdpPackageManager(8); var first = packageManager.StartBlock(1); await _sendUdpImageClient.SendAsync(first, first.Length); while (true) { var imageBuffer = await packageManager.ReadFileToBlock(fileName); //var imageBuffer = packageManager.ImageToBytes(fileName); if (imageBuffer == null) { break; } var packages = await packageManager.BlockToSlice(imageBuffer, 1); while (packages.Length() > 0) { var pBuffer = await packages.DequeueAsync(); await _sendUdpImageClient.SendAsync(pBuffer, pBuffer.Length); await Task.Delay(1); } } var end = packageManager.EndBlock(1); await _sendUdpImageClient.SendAsync(end, end.Length); } }