惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
V
V2EX
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
小众软件
小众软件
Vercel News
Vercel News
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
J
Java Code Geeks
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
B
Blog
美团技术团队
量子位

博客园 - 冷火

Lucene.Net学习 Argotic Syndication Framework生成RSS - 冷火 Confirm GridView Deletes with the ModalPopupExtender 如何在C#中实现图片缩放 [ASP.NET] 限制上传文件类型的两种方法 asp.net采集 在C#怎用一条正则表达式验证用逗号隔开的email地址 关于LumiSoft.Net.POP3.Client接收邮件例子(包括附件) dhtmlXTreeprofessional asp.net导出xml文件 - 冷火 - 博客园 DateDiff Datagridview下一行下一行 GridView控件修改、删除示例(修改含有DropDownList控件) - 冷火 - 博客园 asp.net+JSON+AJAX(基于prototype1.4)做无刷新的2级DropDownList - 冷火 - 博客园 非常好的菜单效果(Accordion风格) 静功解决失眠的问题 ASP.NET中文验证码详解 log4net Config Examples 对XAML进行编辑的辅助类(XamlHelper)
局域网QQ第三版(V1.4)
冷火 · 2009-03-06 · via 博客园 - 冷火

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