这是server端的代码:
private void shouwenjian_Load(object sender, EventArgs e)
{
//StartReceive();
//开启接收线程
Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start(); }
#region 功能函数
private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("3333")); //MessageBox.Show(IPAddress.Any); //创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); while (true)
{ try
{
Socket client = server.Accept();
ClientSocket = client;
Thread TempThread = new Thread(new ThreadStart(this.Create));
TempThread.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
} }
#endregion public void Create()
{
Socket client = ClientSocket; //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
MessageBox.Show("文件名是:" + SendFileName); //获得[包的大小]
string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("包大小" + bagSize); //获得[包的总数量]
int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
//MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小]
string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("最后一个包的大小" + bagLast); //创建一个新文件
FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write); //已发送包的个数
int SendedCount = 0;
while (true)
{ byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数
}
}
//关闭文件流
MyFileStream.Close();
MessageBox.Show("接收完成");
//关闭套接字
client.Close();
} private void button1_Click(object sender, EventArgs e)
{
if (ClientSocket != null)
{
ClientSocket.Close();
ClientSocket = null;
}
Close();
}
}
}
这是client端的代码:
namespace client
{
public partial class fawenjian : Form
{
public fawenjian()
{
InitializeComponent();
} private void fawenjian_Load(object sender, EventArgs e)
{
this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString(); } private void StartSend()
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse(this.textBox6.Text);
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); //指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text));
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//发送[文件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//发送[包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//发送[包的总数量]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//发送[最后一个包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString())); //数据包
byte[] data = new byte[PacketSize];
//开始循环发送数据包
for (int i = 0; i < PacketCount; i++)
{
//从文件流读取数据并填充数据包
EzoneStream.Read(data, 0, data.Length);
//发送数据包
TransferFiles.SendVarData(client, data);
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
TransferFiles.SendVarData(client, data);
} //关闭套接字
client.Close();
//关闭文件流
EzoneStream.Close();
MessageBox.Show("文件传输完毕!");
} private void button1_Click(object sender, EventArgs e)
{
//选择要进行传输的文件
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileInfo EzoneFile = new FileInfo(this.openFileDialog1.FileName);
this.textBox1.Text = EzoneFile.FullName;
this.textBox2.Text = EzoneFile.Name;
this.textBox3.Text = EzoneFile.Length.ToString();
} } 公共的类:
namespace server
{
class TransferFiles
{
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
}
}
private void shouwenjian_Load(object sender, EventArgs e)
{
//StartReceive();
//开启接收线程
Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start(); }
#region 功能函数
private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("3333")); //MessageBox.Show(IPAddress.Any); //创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); while (true)
{ try
{
Socket client = server.Accept();
ClientSocket = client;
Thread TempThread = new Thread(new ThreadStart(this.Create));
TempThread.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
} }
#endregion public void Create()
{
Socket client = ClientSocket; //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
MessageBox.Show("文件名是:" + SendFileName); //获得[包的大小]
string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("包大小" + bagSize); //获得[包的总数量]
int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
//MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小]
string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("最后一个包的大小" + bagLast); //创建一个新文件
FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write); //已发送包的个数
int SendedCount = 0;
while (true)
{ byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数
}
}
//关闭文件流
MyFileStream.Close();
MessageBox.Show("接收完成");
//关闭套接字
client.Close();
} private void button1_Click(object sender, EventArgs e)
{
if (ClientSocket != null)
{
ClientSocket.Close();
ClientSocket = null;
}
Close();
}
}
}
这是client端的代码:
namespace client
{
public partial class fawenjian : Form
{
public fawenjian()
{
InitializeComponent();
} private void fawenjian_Load(object sender, EventArgs e)
{
this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString(); } private void StartSend()
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse(this.textBox6.Text);
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); //指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text));
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//发送[文件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//发送[包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//发送[包的总数量]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//发送[最后一个包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString())); //数据包
byte[] data = new byte[PacketSize];
//开始循环发送数据包
for (int i = 0; i < PacketCount; i++)
{
//从文件流读取数据并填充数据包
EzoneStream.Read(data, 0, data.Length);
//发送数据包
TransferFiles.SendVarData(client, data);
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
TransferFiles.SendVarData(client, data);
} //关闭套接字
client.Close();
//关闭文件流
EzoneStream.Close();
MessageBox.Show("文件传输完毕!");
} private void button1_Click(object sender, EventArgs e)
{
//选择要进行传输的文件
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileInfo EzoneFile = new FileInfo(this.openFileDialog1.FileName);
this.textBox1.Text = EzoneFile.FullName;
this.textBox2.Text = EzoneFile.Name;
this.textBox3.Text = EzoneFile.Length.ToString();
} } 公共的类:
namespace server
{
class TransferFiles
{
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
}
}
解决方案 »
- 求教 var 和=>符号怎么用
- 寻找一个比较完善简单的导出Excel类,格式要是xls
- 创建文件夹的问题
- .net里什么数据结构performace最好?
- 用foreach进行遍历时,出现错误!
- 请问如何将CookieContainer 带入WebBrowser 中使用,达到共享同一Session的目的?
- 日期格式转换出错,GMT,超出范围。。。
- .NET 中不能新建项目 请问高手什么原因 如何解决?
- ★推荐★ Infragistics Netadvantage 2004 Vol1 For COM/WinForm/ASP.NET/Source 功能非常强大的控件集!!!
- Execl数据保存版本问题
- C# 千万个文件内容读取
- 一个小问题
你指定全路径就可以保存在你指定的位置了,如果只指定文件名就是保存在bin/debug下