예제 #1
0
        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());
            }
        }
예제 #2
0
        private void richTextBox1_Drop(object sender, DragEventArgs e)
        {
            if (userList.SelectedIndex < 0)
            {
                MessageBox.Show("请选择目标IP");
                return;
            }
            string[] fileArr = e.Data.GetData(DataFormats.FileDrop) as string[];

            foreach (string path in fileArr)
            {
                //只接受文件传输
                //todo:文件夹传输
                bool isDir = Directory.Exists(path) ? true : false;
                if (isDir)
                {
                    continue;
                }
                var fileLabel1 = new Controls.FileLabel(path);

                //获取文件icon并设置到FileLabel 需引用GDI+
                //System.Drawing.Bitmap img = System.Drawing.Icon.ExtractAssociatedIcon(path).ToBitmap();
                //fileLabel1.fileIcon.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(img.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

                //获取文件icon并设置到FileLabel 使用SHGetFileInfo
                fileLabel1.fileIcon.Source = IconHelper.GetIcon(path, false, false);
                var flr = File.OpenRead(path);
                fileLabel1.FileLength = (int)flr.Length;
                flr.Close();
                fileLabel1.onCloseFile += new Controls.FileLabel.CloseEvent(() =>
                {
                    this.fileCanvas.Dispatcher.Invoke(new Action(() =>
                    {
                        foreach (UserControl uie in this.fileCanvas.Children)
                        {
                            if (uie.Margin.Top > fileLabel1.Margin.Top)
                            {
                                uie.Margin = new Thickness(uie.Margin.Left, uie.Margin.Top - fileLabel1.Height, uie.Margin.Right, uie.Margin.Bottom);
                            }
                        }
                        if (this.fileCanvas.Height > 200)
                        {
                            this.fileCanvas.Height -= fileLabel1.Height;
                        }
                    }));
                });
                fileLabel1.onClosedFile += new Controls.FileLabel.ClosedEvent(() =>
                {
                    if (this.fileCanvas.Children.Count > 0)
                    {
                        return;
                    }
                    this.Width -= 200;
                    fileScrollViewer.Visibility = System.Windows.Visibility.Collapsed;
                });
                fileLabel1.onProgressBegin += new Controls.FileLabel.ProgressBeginEvent(() =>
                {
                    fileLabel1.Height += 10;
                });

                fileLabel1.onProgressEnd += new Controls.FileLabel.ProgressEndEvent(() =>
                {
                    fileLabel1.Height -= 10;
                });

                AddFileToCanvas(fileLabel1, ref this.fileScrollViewer, ref this.fileCanvas);

                MessageInfo msgInfo = new MessageInfo
                {
                    MessageType = MessageInfo.Type.Sign,
                    MessageSign = MessageInfo.Sign.FileRequest,
                    From        = localInfo,
                    Attachment  = new List <AttachmentInfo> {
                        new AttachmentInfo {
                            Id      = fileCanvas.Children.Count - 1,
                            Charset = "UTF-8",
                            Ext     = fileLabel1.FileExt,
                            Length  = fileLabel1.FileLength,
                            Icon    = System.Drawing.Icon.FromHandle(IconHelper.GetIconIntPtr(path, false, isDir)),
                            Name    = fileLabel1.FileName
                        }
                    }
                };
                fileLabel1.ProgresBegin();
                broadcast.SendMessage(Serializable.SerializableToBytes(msgInfo), IPAddress.Parse(selectInfo.IpAddress), port);
            }
            richTextBox1.BorderBrush = bs;
        }