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

来源:百度文库 编辑:神马文学网 时间:2024/04/27 14:21:28
局域网QQ第三版(V1.4)
局域网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
{
///
/// Form1 的摘要说明。
///

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 调用后添加任何构造函数代码
//
}
///
/// 清理所有正在使用的资源。
///

protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
///
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///

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
///
/// 应用程序的主入口点。
///

[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方式。