局域网QQ第三版(V1.4)

局域网QQ第三版(V1.4)

Posted on 2006-12-30 13:31 小y 阅读(41090) 评论(94) 编辑 收藏

局域网QQ,无客户端和服务端之分,局域网的计算机运行本程序就可以互相看见,可以自由聊天和传文件。
本版较之1.0版的改进之处:      使用数据结构类型传送数据;      增加传文件功能(有进度条);
考虑大家重现本程序方便,本程序一直没有用到任何额外的控件和子窗体 版本依然是在VS2003下编译,只要贴进编译器中就可以重现。 转换到VS2005平台的方法: 把程序拷到vs2005中form1.cs里面
在“窗体设计器生成的代码”里面加一句: System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 然后把vs2005自动生成的form1.designer.cs 和program.cs两个文件删掉

 

 

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("文件传送完毕!");         }     } }

说明:      本程序通讯原理是局域网广播,如果使用组播技术可以实现跨网段通讯。传送文件使用p2p方式。

 

---------------------------------------------------------------------
 
 
 
我在关注他 取消关注
5
0
 
(请您对文章做出评价)
posted @ 2012-08-20 21:44  ppshinebl  阅读(236)  评论(0编辑  收藏  举报