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

摘要:
LANQQ没有客户端和服务器的区别。局域网计算机在运行该程序时可以互相查看,并且可以自由地聊天和传输文件。与1.0版本相比,该版本通过使用数据结构类型来传输数据而得到改进;增加文件传输功能;考虑到您可以方便地复制此程序,此程序未使用任何其他控件和子窗体版本。它仍然是在VS2003下编译的,只要粘贴到编译器中就可以复制。

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

免责声明:文章转载自《局域网QQ第三版(V1.4)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇nfs共享文件搭建Ubuntu 16.04下使用Wine安装Xshell 4和Xftp 4下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

axios 处理超时问题 记录

前言:记录最近两天处理请求超时的逻辑。...

页面加载时自动执行(加载)js的几种方法

Js调用onload方法window.onload=function(){func1();func2();func3();}二、JQ方法1.整个页面的document全部加载完成以后执行。不幸的这种方式不仅要求页面的DOMtree全部加载完成,而且要求所有的外部图片和资源全部加载完成。更不幸的是,如果外部资源,例如图片需要很长时间来加载,那么这个js方法执行...

如何设置Navicat的显示字体与字体大小?

方法/步骤打开Navicat点击菜单,再选择在界面,点击下的设置网格字体和大小设置编辑器字体和大小设置命令列界面字体和大小设置ER图表字体和大小,最后点击END...

微信小程序的模板消息与小程序订阅消息

有关获取分发权限的更多信息,请参阅applet侧消息订阅接口wx的步骤3。requestSubscribeMessage。有关发出订阅消息的调用接口的更多信息,请参阅服务器端消息发送接口subscribeMessage。sendwx。requestSubscribeMessage(Objectobject)基本库2.8.2。必须填写参数Objectobjec...

WinSCP命令行操作

WinSCP命令行操作WinSCP是一个在Windows环境下使用SSH的开源图形SFTP客户端。它还支持SCP协议。它的主要功能是在本地和远程计算机之间安全地复制文件。在cmd下直接输入winscp,进入winscp操作界面。查看帮助。直接在下面输入帮助以查看所有可用命令。当第一个参数为“both”时,一个参数与另一个参数同步。未指定目录时,同步当前工作目...

nginx重启

方法二:在启动命令-c前加-t2、重启Nginx服务方法一:进入nginx可执行目录sbin下,输入命令./nginx-sreload即可方法二:查找当前nginx进程号,然后输入命令:kill-HUP进程号实现重启nginx服务...