|
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.IO; namespace myQQ { /// <summary> /// Form1 的摘要说明。 /// </summary> public class Form1 : System.Windows.Forms.Form { public bool runing = false; //标志 public UdpClient listen = new UdpClient(2525); public IPEndPoint End; public IPAddress groupAddress = IPAddress.Parse("255.255.255.255"); //广播地址 public int groupPort = 2525; //广播端口 public IPAddress myIP; public string myName; public string romeName; public IPAddress romeIP; public string romeCon; public sendData mySendData = new sendData(); //本地的0号命令发送包 public bool isfile;//传送文件标志 public string savePath;//传文件的保存地址 public string romeFileName;//远程文件名 public string romeFilel;//远程文件用单位表示的长度,格式为 43M或437K public FileStream sendfilestream;//发送文件流 private System.Windows.Forms.ListBox box; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button3; private System.Windows.Forms.TextBox t_rec; private System.Windows.Forms.TextBox t_send; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button newmsg; private System.Windows.Forms.Label online; private System.Windows.Forms.ToolTip toolTip1; //private System.Windows.Forms.ImageList imageList1; private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button button4; private System.Windows.Forms.OpenFileDialog openFileDialog1; private System.Windows.Forms.TextBox t_filep; private System.Windows.Forms.SaveFileDialog saveFileDialog1; private System.Windows.Forms.Panel processA; private System.Windows.Forms.ProgressBar progressBar1; private System.Windows.Forms.Panel processB; private System.Windows.Forms.ProgressBar progressBar2; private System.ComponentModel.IContainer components; public Form1() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { //System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1)); this.box = new System.Windows.Forms.ListBox(); this.t_rec = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.t_send = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.online = new System.Windows.Forms.Label(); this.button2 = new System.Windows.Forms.Button(); this.newmsg = new System.Windows.Forms.Button(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); //this.imageList1 = new System.Windows.Forms.ImageList(this.components); this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.label3 = new System.Windows.Forms.Label(); this.t_filep = new System.Windows.Forms.TextBox(); this.button4 = new System.Windows.Forms.Button(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); this.processA = new System.Windows.Forms.Panel(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.processB = new System.Windows.Forms.Panel(); this.progressBar2 = new System.Windows.Forms.ProgressBar(); this.processA.SuspendLayout(); this.processB.SuspendLayout(); this.SuspendLayout(); // // box // this.box.ItemHeight = 12; this.box.Location = new System.Drawing.Point(0, 32); this.box.Name = "box"; this.box.Size = new System.Drawing.Size(200, 352); this.box.TabIndex = 0; // // t_rec // this.t_rec.BackColor = System.Drawing.SystemColors.InactiveBorder; this.t_rec.ForeColor = System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(64)), ((System.Byte)(0))); this.t_rec.Location = new System.Drawing.Point(208, 56); this.t_rec.Multiline = true; this.t_rec.Name = "t_rec"; this.t_rec.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.t_rec.Size = new System.Drawing.Size(328, 136); this.t_rec.TabIndex = 1; this.t_rec.Text = ""; // // label1 // this.label1.Location = new System.Drawing.Point(208, 40); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(120, 16); this.label1.TabIndex = 2; this.label1.Text = "接收:"; // // label2 // this.label2.Location = new System.Drawing.Point(208, 200); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(48, 16); this.label2.TabIndex = 2; this.label2.Text = "发送:"; // // t_send // this.t_send.Location = new System.Drawing.Point(208, 224); this.t_send.Multiline = true; this.t_send.Name = "t_send"; this.t_send.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.t_send.Size = new System.Drawing.Size(328, 120); this.t_send.TabIndex = 1; this.t_send.Text = ""; // // button1 // this.button1.Location = new System.Drawing.Point(440, 352); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 32); this.button1.TabIndex = 3; this.button1.Text = "发 送"; this.button1.Click += new System.EventHandler(this.button1_Click); // // button3 // this.button3.FlatStyle = System.Windows.Forms.FlatStyle.Popup; this.button3.Location = new System.Drawing.Point(120, 5); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(56, 23); this.button3.TabIndex = 4; this.button3.Text = "刷 新"; this.button3.Click += new System.EventHandler(this.button3_Click); // // online // this.online.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134))); this.online.ForeColor = System.Drawing.Color.Blue; this.online.Location = new System.Drawing.Point(8, 8); this.online.Name = "online"; this.online.Size = new System.Drawing.Size(88, 16); this.online.TabIndex = 5; this.online.Text = "在线用户:"; // // button2 // this.button2.Location = new System.Drawing.Point(352, 352); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 32); this.button2.TabIndex = 6; this.button2.Text = "清 空"; this.button2.Click += new System.EventHandler(this.button2_Click); // // newmsg // this.newmsg.Location = new System.Drawing.Point(208, 56); this.newmsg.Name = "newmsg"; this.newmsg.Size = new System.Drawing.Size(328, 136); this.newmsg.TabIndex = 7; this.newmsg.Text = "有新消息了!"; this.newmsg.Click += new System.EventHandler(this.newmsg_Click); // // imageList1 // //this.imageList1.ImageSize = new System.Drawing.Size(32, 32); //this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); //this.imageList1.TransparentColor = System.Drawing.Color.Transparent; // // linkLabel1 // this.linkLabel1.Location = new System.Drawing.Point(264, 200); this.linkLabel1.Name = "linkLabel1"; this.linkLabel1.Size = new System.Drawing.Size(48, 16); this.linkLabel1.TabIndex = 8; this.linkLabel1.TabStop = true; this.linkLabel1.Text = "传文件"; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // label3 // this.label3.Location = new System.Drawing.Point(208, 240); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(72, 16); this.label3.TabIndex = 9; this.label3.Text = "文件地址:"; // // t_filep // this.t_filep.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.t_filep.Location = new System.Drawing.Point(272, 232); this.t_filep.Name = "t_filep"; this.t_filep.Size = new System.Drawing.Size(233, 21); this.t_filep.TabIndex = 10; this.t_filep.Text = ""; // // button4 // this.button4.FlatStyle = System.Windows.Forms.FlatStyle.Popup; this.button4.Location = new System.Drawing.Point(504, 232); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(32, 21); this.button4.TabIndex = 11; this.button4.Text = "…"; this.button4.Click += new System.EventHandler(this.button4_Click); // // processA // this.processA.BackColor = System.Drawing.SystemColors.Window; this.processA.Controls.Add(this.progressBar1); this.processA.Location = new System.Drawing.Point(224, 264); this.processA.Name = "processA"; this.processA.Size = new System.Drawing.Size(288, 24); this.processA.TabIndex = 12; // // progressBar1 // this.progressBar1.Location = new System.Drawing.Point(8, 6); this.progressBar1.Name = "progressBar1"; this.progressBar1.Size = new System.Drawing.Size(272, 12); this.progressBar1.Step = 5; this.progressBar1.TabIndex = 0; // // processB // this.processB.BackColor = System.Drawing.SystemColors.Control; this.processB.Controls.Add(this.progressBar2); this.processB.Location = new System.Drawing.Point(224, 112); this.processB.Name = "processB"; this.processB.Size = new System.Drawing.Size(288, 24); this.processB.TabIndex = 12; // // progressBar2 // this.progressBar2.Location = new System.Drawing.Point(8, 6); this.progressBar2.Name = "progressBar2"; this.progressBar2.Size = new System.Drawing.Size(272, 12); this.progressBar2.Step = 5; this.progressBar2.TabIndex = 0; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(544, 389); this.Controls.Add(this.processB); this.Controls.Add(this.processA); this.Controls.Add(this.t_send); this.Controls.Add(this.button4); this.Controls.Add(this.t_filep); this.Controls.Add(this.label3); this.Controls.Add(this.linkLabel1); this.Controls.Add(this.button2); this.Controls.Add(this.online); this.Controls.Add(this.button3); this.Controls.Add(this.button1); this.Controls.Add(this.label1); this.Controls.Add(this.box); this.Controls.Add(this.label2); this.Controls.Add(this.t_rec); this.Controls.Add(this.newmsg); //this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "Form1"; this.Text = "小y"; this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing); this.Load += new System.EventHandler(this.Form1_Load); this.processA.ResumeLayout(false); this.processB.ResumeLayout(false); this.ResumeLayout(false); } #endregion /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } //数据包格式 public struct sendData { public byte commandNo;//命令号 1字节 public IPAddress fromIP;//发送端IP 4字节 public int nameLength; //名字的字节数 4字节 public string computerName;//计算机名 x字节 public IPAddress toIP;//接收端IP; 4字节 public string content;//内容 y字节 } private void Form1_Load(object sender, System.EventArgs e) { End = new IPEndPoint(groupAddress, groupPort); //初始化计算机名和端口 IPHostEntry myentry = Dns.GetHostByName(Dns.GetHostName()); myIP = new IPAddress(myentry.AddressList[0].Address); myName = Dns.GetHostName(); box.Items.Add("IP 主机名"); //开启监听线程 runing = true; Thread myThread = new Thread(new ThreadStart(this.ListenPort)); myThread.IsBackground = false; myThread.Start(); //发送上线信息 mySendData.commandNo = 0; mySendData.fromIP = myIP; mySendData.computerName = myName; mySendData.toIP = myIP; mySendData.content = "上线提示"; byte[] sendb = StructToBytes(mySendData); SendPack(sendb); //初始化窗体位置 t_send.Height = 120; t_send.Top = 224; linkLabel1.Text = "传文件"; processA.Visible = false;//发送的进度 processB.Visible = false;//接收的进度 } //侦听指定端口的广播地址UDP包 public void ListenPort() { IPEndPoint tempEnd = new IPEndPoint(IPAddress.Any, 2525); while (runing) { Application.DoEvents(); try { byte[] recb = listen.Receive(ref tempEnd); // 检查所接收到的信息and处理之 checkMessage(recb); } catch (Exception e) { MessageBox.Show("出现错误:" + e.Message.ToString()); break; } } listen.Close(); box.Items.Add("线程已经退出!"); runing = false; } //循环接收包 public void checkMessage(byte[] recbb) { sendData recData = BytesToStruct(recbb); romeName = recData.computerName; romeIP = recData.fromIP; romeCon = recData.content; switch (recData.commandNo) { case 0x00: //刷新 if (recData.toIP.Equals(myIP)) { if (box.FindString(recData.fromIP.ToString() + " " + recData.computerName) <= 0) box.Items.Add(recData.fromIP.ToString() + " " + recData.computerName); online.Text = "在线用户:" + (box.Items.Count - 1) + "人"; } else if (recData.fromIP.Equals(recData.toIP)) { //从其他机器发送过来的刷新请求 //返回自己的信息 mySendData.commandNo = 0x00; mySendData.toIP = recData.toIP; mySendData.content = "上线提示"; byte[] sendb = StructToBytes(mySendData); SendPack(sendb); //如果不存在则添加该用户 if (box.FindString(recData.fromIP.ToString() + " " + recData.computerName) <= 0) box.Items.Add(recData.fromIP.ToString() + " " + recData.computerName); } break; case 0x01: //发言 if (recData.toIP.Equals(myIP) && !isfile) {//当传送的不包含文件时才显示“有新消息了” showNe(); } break; case 0x02: //请求传文件 if (recData.toIP.Equals(myIP)) {//准备接收文件 romeFileName = romeCon.Split('+')[0]; romeFilel = romeCon.Split('+')[1]; readyRecFile(); } break; case 0x03://传文件 if (recData.toIP.Equals(myIP)) {//传送文件 Thread mysend = new Thread(new ThreadStart(sendFile)); mysend.Start(); } break; case 0x09: //确认包 if (recData.toIP.Equals(myIP)) MessageBox.Show("信息来自:" + recData.computerName + "(" + recData.fromIP.ToString() + ")\r\n" + recData.content, "消息"); break; } } //发送数据包到广播地址 public void SendPack(byte[] sendbs) { try { listen.Send(sendbs, sendbs.Length, End); } catch (Exception e) { MessageBox.Show(e.Message.ToString()); } } //struct转换成byte[] public static byte[] StructToBytes(sendData structObj) { byte[] commandb = new byte[1]; commandb[0] = structObj.commandNo; byte[] fromipb = structObj.fromIP.GetAddressBytes(); byte[] nameb = Encoding.Default.GetBytes(structObj.computerName); byte[] lengthb = BitConverter.GetBytes(nameb.Length); byte[] toipb = structObj.toIP.GetAddressBytes(); byte[] contentb = Encoding.Default.GetBytes(structObj.content); byte[] buffer = new byte[13 + nameb.Length + contentb.Length]; int index = 0; commandb.CopyTo(buffer, index); index += commandb.Length; fromipb.CopyTo(buffer, index); index += fromipb.Length; lengthb.CopyTo(buffer, index); index += lengthb.Length; nameb.CopyTo(buffer, index); index += nameb.Length; toipb.CopyTo(buffer, index); index += toipb.Length; contentb.CopyTo(buffer, index); return buffer; } //byte转换成struct public static sendData BytesToStruct(byte[] bytes) { sendData myre = new sendData(); myre.commandNo = bytes[0]; byte[] ipb = new byte[4]; Array.Copy(bytes, 1, ipb, 0, 4); myre.fromIP = IPAddress.Parse(ipByteToString(ipb)); myre.nameLength = BitConverter.ToInt32(bytes, 5); myre.computerName = Encoding.Default.GetString(bytes, 9, myre.nameLength); Array.Copy(bytes, 9 + myre.nameLength, ipb, 0, 4); myre.toIP = IPAddress.Parse(ipByteToString(ipb)); myre.content = Encoding.Default.GetString(bytes, 13 + myre.nameLength, bytes.Length - 13 - myre.nameLength); return myre; } //将byte[]表示的IP地址转换成IPAddress类型 public static string ipByteToString(byte[] ipbt) { string temp = ""; temp = (int)ipbt[0] + "." + (int)ipbt[1] + "." + (int)ipbt[2] + "." + (int)ipbt[3]; return temp; } //刷新 private void button3_Click(object sender, System.EventArgs e) { box.Items.Clear(); box.Items.Add("IP 主机名"); mySendData.commandNo = 0; mySendData.fromIP = myIP; mySendData.computerName = myName; mySendData.toIP = myIP; mySendData.content = "上线提示"; byte[] sendb = StructToBytes(mySendData); SendPack(sendb); } //关闭循环 private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { runing = false; UdpClient mm = new UdpClient(); IPEndPoint tempIPEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2525); mySendData.commandNo = 0; mySendData.fromIP = myIP; mySendData.computerName = myName; mySendData.toIP = myIP; mySendData.content = "上线提示"; byte[] sendb = StructToBytes(mySendData); mm.Send(sendb, sendb.Length, tempIPEnd); } //发送 private void button1_Click(object sender, System.EventArgs e) { if (box.SelectedItem == null || box.SelectedIndex == 0) { MessageBox.Show("请先选择一个用户!"); return; } if (linkLabel1.Text == "不传文件" && t_filep.Text != "") {//需要传文件 //首先发送2号命令 要求对方准备接收 sendfilestream = new FileStream(t_filep.Text, FileMode.Open, FileAccess.Read); long filelength = sendfilestream.Length; string totalsteps; int temp; if (filelength / (1024 * 1024) > 10) {//文件>10M时用M做为进度最小单位 temp = (int)(filelength / (1024 * 1024)); totalsteps = temp + "M"; } else {//小于10M的文件用k做为最小单位 temp = (int)(filelength / 1024); totalsteps = temp + "K"; } //用做接收端时的公共变量保存发送的临时值 romeFilel = totalsteps; string filename = Path.GetFileName(t_filep.Text); mySendData.commandNo = 0x02; mySendData.fromIP = myIP; mySendData.computerName = myName; mySendData.toIP = IPAddress.Parse(box.SelectedItem.ToString().Split(' ')[0]); mySendData.content = filename + "+" + totalsteps;//格式:yy.txt+62K+64990 byte[] sendb = StructToBytes(mySendData); SendPack(sendb); //界面上的处理 t_send.Height = 120; t_send.Top = 224; linkLabel1.Text = "传文件"; } //发言 if (t_send.Text == "") { return; } mySendData.commandNo = 0x01; mySendData.fromIP = myIP; mySendData.computerName = myName; mySendData.toIP = IPAddress.Parse(box.SelectedItem.ToString().Split(' ')[0]); mySendData.content = t_send.Text; byte[] sendb2 = StructToBytes(mySendData); SendPack(sendb2); } //清空 private void button2_Click(object sender, System.EventArgs e) { t_send.Text = string.Empty; t_rec.Text = string.Empty; } //单击显示接收的信息并隐藏自身 private void newmsg_Click(object sender, System.EventArgs e) { if (isfile) {//当传送的含有文件时 saveFileDialog1.Filter = "所有格式|*.*"; saveFileDialog1.FileName = romeFileName; if (saveFileDialog1.ShowDialog() == DialogResult.OK) savePath = saveFileDialog1.FileName; else return; t_rec.Text = "消息来自" + romeName + "(" + romeIP.ToString() + ")" + DateTime.Now.ToShortDateString(); t_rec.Text += "\r\n> " + romeCon; //界面的处理 newmsg.SendToBack(); t_send.Height = 120; t_send.Top = 224; linkLabel1.Text = "传文件"; //返回一个确认接收包 mySendData.commandNo = 0x03; mySendData.fromIP = myIP; mySendData.computerName = myName; mySendData.toIP = romeIP; mySendData.content = "ready!"; byte[] sendb = StructToBytes(mySendData); SendPack(sendb); //复位文件标志 isfile = false; //同时开启线程开始监听 Thread myrecv = new Thread(new ThreadStart(listenPort)); myrecv.Start(); return; } t_rec.Text = "消息来自" + romeName + "(" + romeIP.ToString() + ")" + DateTime.Now.ToShortDateString(); t_rec.Text += "\r\n> " + romeCon; mySendData.commandNo = 0x09; mySendData.toIP = romeIP; mySendData.content = "信息被打开!"; byte[] sendb2 = StructToBytes(mySendData); SendPack(sendb2); newmsg.SendToBack(); } //当有信息时显示提示按钮 public void showNe() { //窗体显示 if (this.WindowState != FormWindowState.Normal) { this.Visible = true; this.WindowState = FormWindowState.Normal; } newmsg.Text = "有新消息了"; newmsg.BringToFront(); } //准备接收文件 public void readyRecFile() { //窗体显示 if (this.WindowState != FormWindowState.Normal) { this.Visible = true; this.WindowState = FormWindowState.Normal; } isfile = true; newmsg.Text = romeFileName + "(" + romeFilel + ")"; newmsg.BringToFront(); } //传文件 private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) { if (linkLabel1.Text == "传文件") { t_send.Height = 80; t_send.Top = 264; linkLabel1.Text = "不传文件"; } else { t_send.Height = 120; t_send.Top = 224; linkLabel1.Text = "传文件"; } } //打开文件 private void button4_Click(object sender, System.EventArgs e) { openFileDialog1.Filter = "所有文件|*.*|压缩文件|*.rar"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { t_filep.Text = openFileDialog1.FileName; } } //监听文件传送socket的线程——————功能:接收文件 public void listenPort() { TcpListener listener = new TcpListener(2626); listener.Start(); Socket s = listener.AcceptSocket(); FileStream filestream = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write); NetworkStream stream = new NetworkStream(s); //定义缓冲区 byte[] bb = new byte[1024]; //循环读socket流 int tt = 0; //进度条 processB.Visible = true; processB.BackColor = System.Drawing.SystemColors.Control; int stepoff; if (romeFilel[romeFilel.Length - 1] == 'K') stepoff = 1024; else stepoff = 1024 * 1024; int totalste = int.Parse(romeFilel.Substring(0, romeFilel.Length - 1)); progressBar2.Maximum = totalste; progressBar2.Step = totalste / 20; float recbytes = 0; while ((tt = stream.Read(bb, 0, 1024)) != 0) {//接收数据 filestream.Write(bb, 0, tt); filestream.Flush(); //更新进度条 recbytes += (float)tt / stepoff; progressBar2.Value = (int)recbytes; } filestream.Close(); processB.Visible = false; MessageBox.Show("文件接收完毕!"); } //传送文件的线程————————功能:发送文件服务端 public void sendFile() { TcpClient serverClient = new TcpClient(); serverClient.Connect(romeIP, 2626); NetworkStream stream = serverClient.GetStream(); //定义缓冲区 byte[] bb = new byte[1024]; //循环读文件 int number; //进度条 processA.Visible = true; processA.BackColor = System.Drawing.SystemColors.Window; int stepoff; if (romeFilel[romeFilel.Length - 1] == 'K') stepoff = 1024; else stepoff = 1024 * 1024; int totalste = int.Parse(romeFilel.Substring(0, romeFilel.Length - 1)); progressBar1.Maximum = totalste; progressBar1.Step = totalste / 20; float sendedbytes = 0; while ((number = sendfilestream.Read(bb, 0, 1024)) != 0) {//向客户端发送流 stream.Write(bb, 0, number); //刷新流 stream.Flush(); //进度条 sendedbytes += (float)number / stepoff; progressBar1.Value = (int)sendedbytes; } sendfilestream.Close(); stream.Close(); processA.Visible = false; MessageBox.Show("文件传送完毕!"); } } } |