public SendStatus UploadFile(FileSendInfo lstFileinfo) { SendStatus result = SendStatus.Complete; try { FileInfo file = new FileInfo(lstFileinfo.FileFullPath); if (file.Exists == false) { Debug.Assert(false, "파일이 존재하지 않습니다 : " + lstFileinfo.FileFullPath); result = SendStatus.Fail; } string strFilePath = "IH" + DateTime.Now.ToString("yyyyMMddHHmmssfff00") + file.Extension; fileTransferUtility.Upload(lstFileinfo.FileFullPath, bucketName, strFilePath); Console.WriteLine("Upload Complete : " + lstFileinfo.FileFullPath); log.Debug("Upload Complete : " + lstFileinfo.FileFullPath + " / " + strFilePath); } catch (AmazonS3Exception e) { Debug.Assert(false, e.Message); log.Error(string.Format("Error encountered on server. Message:'{0}' when writing an object", e.Message)); result = SendStatus.Fail; } catch (Exception e) { Debug.Assert(false, e.Message); log.Error(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message)); result = SendStatus.Fail; } return(result); }
private int fileSpeed = 60 * 1024;//buffer lebngth public MainWindow() { try { InitializeComponent(); this.fileScrollViewer.Background = Brushes.LightGray; this.fileScrollViewer.BorderBrush = Brushes.Gray; } catch (Exception ex) { AppLog.SysLog(ex.ToString()); } try { localInfo = new UserInfo { IpAddress = NetworkUtil.GetLocalIp(), Name = this.textBox1.Text }; richTextBox1.KeyDown += richTextBox1_KeyDown; this.userList.SelectionChanged += new SelectionChangedEventHandler(new EventHandler((object obj, EventArgs e) => { if (fileCanvas.Children.Count > 0) { MessageBox.Show("有尚未完成的文件传输"); return; } if (userList.SelectedItem != null) { selectInfo = new UserInfo { IpAddress = (userList.SelectedItem as ListBoxItem).Content.ToString() } } ; })); fileReceive = new Queue(); fileSend = new Queue(); running = true; broadcast = new UdpServer(IPAddress.Parse(NetworkUtil.GetNetBroad()), IPAddress.Any, port); Online = new MessageInfo { From = localInfo, MessageType = MessageInfo.Type.Sign, MessageSign = MessageInfo.Sign.Online }; broadcast.OnReceiveComplete += new UdpServer.ReceiveComplete((s) => { MemoryStream ms = new MemoryStream(s); MessageInfo msg = NetBird.Util.Serializable.Deserialize <MessageInfo>(ms); ms.Close(); if (msg.From != null) { switch (msg.MessageType) { case MessageInfo.Type.Sign: switch (msg.MessageSign) { case MessageInfo.Sign.Online: this.userList.Dispatcher.Invoke(new Action(() => { //AddUserList(msg.From); //测试时允许添加本机IP到UserList if (msg.From.IpAddress == localInfo.IpAddress) { return; } AddUserList(msg.From); MessageInfo rspInfo = new MessageInfo { From = localInfo, MessageSign = MessageInfo.Sign.ResponseOnline, MessageType = MessageInfo.Type.Sign }; broadcast.SendMessage(Serializable.SerializableToBytes(rspInfo), IPAddress.Parse(msg.From.IpAddress), port); })); break; case MessageInfo.Sign.Offline: this.userList.Dispatcher.Invoke(new Action(() => { if (localInfo.IpAddress != msg.From.IpAddress) { RemoveUserList(msg.From); } })); break; case MessageInfo.Sign.FileRequest: if (msg.Attachment != null) { fileReceive.Enqueue(msg); } break; case MessageInfo.Sign.FileAccept: if (msg.Attachment != null) { fileSend.Enqueue(msg); } break; case MessageInfo.Sign.ResponseOnline: this.userList.Dispatcher.Invoke(new Action(() => { AddUserList(msg.From); })); break; } break; case MessageInfo.Type.Common: CommonMessage(string.Format("{0}:{1}", msg.From.IpAddress, msg.MessageBody)); break; } } }); broadcast.OnSendComplete += new UdpServer.SendComplete(() => { }); broadcast.SendMessage(NetBird.Util.Serializable.SerializableToBytes(Online)); broadcast.StartListen(); //udpClient = new UdpClient(port); //listen = new UdpClient(port); //tcpClient = new TcpClient(); fileThread = new Thread(new ThreadStart(() => { fileRequestListen = new UdpServer(IPAddress.Parse(localInfo.IpAddress), IPAddress.Any, filePort); fileRequestListen.StartListen(); fileRequestListen.OnSendComplete += new UdpServer.SendComplete(() => { }); fileRequestListen.OnReceiveComplete += new UdpServer.ReceiveComplete((byte[] content) => { MemoryStream ms = new MemoryStream(content); FileSendInfo fsInfo = Serializable.Deserialize <FileSendInfo>(ms); ms.Close(); switch (fsInfo.Type) { case FileSendInfo.InfoType.Send: this.fileRCanvas.Dispatcher.Invoke(new Action(() => { try { var rlb = GetFileLabelById(fsInfo.Id); if (rlb != null) { FileStream rfs = File.OpenWrite(rlb.FilePath); rfs.Position = fsInfo.Seek; rfs.Write(fsInfo.Content, 0, fsInfo.Content.Length); int rseek = (int)rfs.Length; rfs.Close(); //double ss = (double)rseek / (double)rlb.FileLength; rlb.Progress.Value = ((double)rseek / (double)rlb.FileLength) * 100; FileSendInfo rnfsInfo = new FileSendInfo { Id = fsInfo.Id, Seek = rseek, Type = FileSendInfo.InfoType.Back, IpAddress = localInfo.IpAddress }; fileRequestListen.SendMessage(Serializable.SerializableToBytes(rnfsInfo), IPAddress.Parse(fsInfo.IpAddress), filePort); } } catch (Exception ex0) { throw ex0; } })); break; case FileSendInfo.InfoType.Back: this.fileCanvas.Dispatcher.Invoke(new Action(() => { try { var lb = fileCanvas.Children[fsInfo.Id] as Controls.FileLabel; int seek = fsInfo.Seek; FileSendInfo nfsInfo = null; FileStream fs = File.OpenRead(lb.FilePath); //文件发送完信号 if (fs.Length - 1 < seek) { nfsInfo = new FileSendInfo { Id = fsInfo.Id, IpAddress = localInfo.IpAddress, Type = FileSendInfo.InfoType.Over }; } else { byte[] buffer = new byte[fileSpeed]; fs.Position = seek; fs.Read(buffer, 0, buffer.Length); fs.Close(); lb.Progress.Value = ((double)seek / (double)lb.FileLength) * 100; nfsInfo = new FileSendInfo { Id = fsInfo.Id, Seek = seek, Content = buffer, IpAddress = localInfo.IpAddress, Type = FileSendInfo.InfoType.Send }; } fileRequestListen.SendMessage(Serializable.SerializableToBytes(nfsInfo), IPAddress.Parse(fsInfo.IpAddress), filePort); } catch (Exception ex0) { throw ex0; } })); break; case FileSendInfo.InfoType.SendClose: case FileSendInfo.InfoType.Over: this.fileRCanvas.Dispatcher.Invoke(new Action(() => { var olb = GetFileLabelById(fsInfo.Id); if (olb != null) { olb.Close(); } })); break; case FileSendInfo.InfoType.AcceptClose: this.fileCanvas.Dispatcher.Invoke(new Action(() => { var lb = fileCanvas.Children[fsInfo.Id] as Controls.FileLabel; if (lb != null) { lb.Close(); } })); break; } }); while (running) { if (fileSend.Count > 0) { MessageInfo fileInfo = fileSend.Dequeue() as MessageInfo; AttachmentInfo attr = fileInfo.Attachment[0]; this.fileCanvas.Dispatcher.Invoke(new Action(() => { Controls.FileLabel lb = fileCanvas.Children[attr.Id] as Controls.FileLabel; lb.onCloseFile += new Controls.FileLabel.CloseEvent(() => { FileSendInfo fsOver = new FileSendInfo { Id = attr.Id, IpAddress = localInfo.IpAddress, Type = FileSendInfo.InfoType.SendClose }; fileRequestListen.SendMessage(Serializable.SerializableToBytes(fsOver), IPAddress.Parse(fileInfo.From.IpAddress), filePort); }); byte[] buffer = new byte[fileSpeed]; FileStream fs = File.OpenRead(lb.FilePath); fs.Position = 0; fs.Read(buffer, 0, buffer.Length); fs.Close(); FileSendInfo fsInfo = new FileSendInfo { Id = attr.Id, Seek = 0, Content = buffer, IpAddress = localInfo.IpAddress, Type = FileSendInfo.InfoType.Send }; fileRequestListen.SendMessage(Serializable.SerializableToBytes(fsInfo), IPAddress.Parse(fileInfo.From.IpAddress), filePort); //fileRequestListen.SendMessage(); //todu 发送文件 })); } if (fileReceive.Count > 0) { #if DEBUG try { #endif //todo 接受文件 (需要Add到FileCanvas) MessageInfo fileInfo = fileReceive.Dequeue() as MessageInfo; AttachmentInfo attr = fileInfo.Attachment[0]; this.fileRCanvas.Dispatcher.Invoke(new Action(() => { var fb = new Controls.FileLabel(string.Format("{0}{1}.{2}", PathInfo.GetUserAttachmentDir(), attr.Name, attr.Ext)); fb.Id = attr.Id; fb.FileLength = attr.Length; fb.fileIcon.Source = IconHelper.GetIcon(attr.Icon.Handle); fb.onCloseFile += new Controls.FileLabel.CloseEvent(() => { foreach (UserControl uie in this.fileRCanvas.Children) { if (uie.Margin.Top > fb.Margin.Top) { uie.Margin = new Thickness(uie.Margin.Left, uie.Margin.Top - fb.Height, uie.Margin.Right, uie.Margin.Bottom); } } if (this.fileRCanvas.Height > 200) { this.fileRCanvas.Height -= fb.Height; } }); fb.onClosedFile += new Controls.FileLabel.ClosedEvent(() => { if (this.fileRCanvas.Children.Count > 0) { return; } this.Width -= 200; fileRScrollViewer.Visibility = System.Windows.Visibility.Collapsed; FileSendInfo fsOver = new FileSendInfo { Id = attr.Id, IpAddress = localInfo.IpAddress, Type = FileSendInfo.InfoType.AcceptClose }; fileRequestListen.SendMessage(Serializable.SerializableToBytes(fsOver), IPAddress.Parse(fileInfo.From.IpAddress), filePort); }); fb.onProgressBegin += new Controls.FileLabel.ProgressBeginEvent(() => { fb.Height += 10; FileSendInfo fsInfo = new FileSendInfo { Id = attr.Id, Seek = 0, IpAddress = localInfo.IpAddress, Type = FileSendInfo.InfoType.Back }; fileRequestListen.SendMessage(Serializable.SerializableToBytes(fsInfo), IPAddress.Parse(fileInfo.From.IpAddress), filePort); }); fb.onProgressEnd += new Controls.FileLabel.ProgressEndEvent(() => { fb.Height -= 10; }); AddFileToCanvas(fb, ref this.fileRScrollViewer, ref this.fileRCanvas); fb.Accept(); })); #if DEBUG } catch (Exception ex) { throw ex; } #endif } } })); fileThread.IsBackground = true; fileThread.Start(); this.richTextBox1.AddHandler(RichTextBox.DragOverEvent, new DragEventHandler(richTextBox1_DragOver), true); this.richTextBox1.AddHandler(RichTextBox.DropEvent, new DragEventHandler(richTextBox1_Drop), true); this.richTextBox1.AddHandler(RichTextBox.DragLeaveEvent, new DragEventHandler(richTextBox1_DragLeave), true); bs = this.richTextBox1.BorderBrush; } catch (Exception e) { AppLog.SysLog(e.ToString()); } }