程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 局域網QQ第三版(V1.4)(轉)

局域網QQ第三版(V1.4)(轉)

編輯:.NET實例教程

局域網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.PaneprocessA;
        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();

  &nbsp;         //
            // 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";
    &nbsp;       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);
          &nbsp; //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);
            //
  &nbsp;         // 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;
      &nbsp;     //
            // 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);
            //初始化計算機名和端口
    &nbsp;       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 = "上線提示";
          &n         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;
  &nbsp;             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 = "";
&nbsp;           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);
       &nbsp;        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;
          &nbsp;     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;
          &nbsp;     //界面的處理
                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()
        {
            //窗體顯示
   &nbsp;        if (this.WindowState != FormWindowstate.Normal)
          &nbsp; {
                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 = "傳文件";
    &nbsp;       }
        }
        //打開文件
        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;
&nbsp;           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("文件傳送完畢!");
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved