局域网QQ(C#版) 第三版

局域网QQ,无客户端和服务端之分,局域网的计算机运行本程序就可以互相看见,可以自由聊天和传文件。

本版较之1.0版的改进之处:
     使用数据结构类型传送数据;
     增加传文件功能(有进度条);

考虑大家重现本程序方便,本程序一直没有用到任何额外的控件和子窗体
版本依然是在VS2003下编译,只要贴进编译器中就可以重现。
在VS2005下编译只需要在“窗体设计器生成的代码”里面加一句:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

  

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

 局域网QQ(V1.4)

时间: 2024-08-21 10:11:42

局域网QQ(C#版) 第三版的相关文章

Adobe Photoshop CS 简体中文免安装增强版 第三版 下载_常用工具

用法:运行"!)绿化.bat"即可正常使用.运行"!)缩略图.bat"可实现 PSD 文件缩略图察看功能:运行"-)卸除.bat"即可卸除绿化时加到系统的东西. ---------------------第三版更新内容:---------------------1.听取部分网友的意见,删除了素描大师滤镜(Strokes Master 1.15),因为不少网友反映这个滤镜有时有问题,尽管我本人试来试去都没发现问题,由于反映的人也不少,故只好照顾一下

“三版合一”模式 折射出网页游戏变革的新思路

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 10月29日,巨人网络宣布,该公司首款网页游戏<黄金国度>将于11月3日正式开启封测.该游戏业界推出了豪华网页版.便携手机版.简化办公室版的"三版合一"模式.另外,该游戏针对白领推出的简化办公室版,值得业界关注. 无容置疑巨人的目光是远大的,该公司推出的<黄金国度>就是网页游戏的变革开始,在网页游戏

谁有&amp;amp;lt;&amp;amp;lt;CLR Via C#&amp;amp;gt;&amp;amp;gt;第三版中文版的电子书

问题描述 谁有<<CLRViaC#>>第三版中文版的电子书,我是个初学者,看网上推荐此书的人多,想看一下,我的QQ:330784617.谢谢!! 解决方案 解决方案二:试一试我一般看英文的,虽然很少看书:(解决方案三: 解决方案四:第二版有的,想看第三版.

《鸟哥的Linux 私房菜 基础学习篇(第三版)》——0.2 个人计算机架构与接口设备

0.2 个人计算机架构与接口设备 鸟哥的Linux 私房菜 基础学习篇(第三版) 一般消费者常说的计算机通常指的就是x86的个人计算机架构,因此我们有必要来了解一下这个架构的各个组件.事实上,Linux最早在发展的时候,就是依据个人计算机的架构来发展的,所以,真的需要了解一下.另外,因为两大主流x86开发商(Intel, AMD)的CPU架构并不兼容,而且设计理念也有所区别,所以两大主流CPU所需要的主板芯片组设计也就不太相同.目前最新的主板架构主要如图0-4所示. 就如同前一节提到的,整个主板

宣传易第三版测试版本月隆重登场

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 宣传易第三版测试版本月隆重登场,全新的第三版,其特点:解决速度运算较慢问题,平台更稳定,操作更方便人性化,内核进行了全面优化!在广告主投放广告方面更精准,更专业!网站主方面也有了改变,需要添加网址审核通过方可投放广告!还有更多的简便易操作的功能.到时候官方论坛有相应的公告! 联盟地址:http://bbs.ads8.com 站长网联盟信息发布

QQ聊天机器人for PHP版 (登录,收、发消息)

QQ聊天机器人for PHP版 (登录,收.发消息) 01 <?php 02  // 不多说了,直接上转载请著名出处 php100.com 03 include "http.class.php"; 04   05 class qq { 06   07     public $sid; 08     public $http; 09     public $qq_num; 10   11     function __construct() { 12         $this-&

浅谈.NET下的多线程和并行计算(十二)CLR via C#第三版阅读笔记(1)

最近此书出了第三版,在阅读此书线程部分的过程中有很多心得,补充了此前知识盲点,因此把这些 关键和重要的知识点汇集成日志文章并且纳入到这个系列中.顺便说一下,笔者喜欢这本书的原因是作者 作为微软顾问并没有按照MSDN的教条教大家怎么去用而是能说出很多自己的观点甚至很多是微软.NET框架 不够的地方,并给出自己的实现. 为什么说线程是比较昂贵的? 1)从内存上来说,(对于32位架构)每一个线程包含线程内核对象(700字节)/线程环境块(4KB)/ 内核堆栈(12KB)/用户堆栈(1MB).并且可以发

QQ输入法纯净版和传统版有什么区别?

  QQ输入法纯净版和传统版有什么区别?哪个好? 纯净版:1. 优化核心输入方式,提高智能性; 2. 大幅减少安装包体积,安装运行更畅快; 3. 整合右键菜单设置项,使选项更加精简,一目了然; 产品理念:回归输入本质,让您的输入体验更加轻松愉悦. 简约设计,摒弃冗余,永无弹窗广告,还您一个安静无扰的输入体验. 传统版:1.词库大,打字精准流畅功能丰富 2.支持全拼.双拼.简拼数千皮肤,让你的输入法与众不同 3.细节贴心,强大而保持简单.

QQ浏览器V7.5.1版更新体验

  对于大多数PC用户来讲,浏览器仍然是最常用的互联网入口工具之一.尽管移动互联网已然成为趋势,但是众多的浏览器开发公司依然将坚守着PC最后的阵地.PC端的浏览器在功能和智能化.个性化等方面亦是不断被打磨.优化,在易用性上更加人性化.在与移动端的连通上,PC端的浏览器也是不遗余力,让在PC端的体验能够轻松过渡到移动端.日前升级的QQ浏览器V7.5.1版,在界面设计上更加简洁,突出轻快.实用和安全,并且QQ浏览器一个最大的优势就是与我们常用的QQ账户相关联,可以轻松实现"跨屏穿越"和书签