局域网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方式。

posted on 2009-03-06 20:29  冷火  阅读(444)  评论(1编辑  收藏  举报