110,552
社区成员
发帖
与我相关
我的任务
分享
//发送文件夹中所有子文件
private void UpLoadFolder()
{
DirectoryInfo di = new DirectoryInfo(fb.SelectedPath);
foreach (FileInfo fi in di.GetFiles())
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.44"), 8888);
client.Connect(ipPoint);
//发送文件名
string filename = fi.Name;
byte[] bt_filename = System.Text.Encoding.Unicode.GetBytes(filename);
SendVarData(client, bt_filename);
//byte[] bt_data = new byte[50000];
FileStream fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
//文件大于50000字节
if (fs.Length >= 50000)
{
//发送整包
byte[] bt_data = new byte[50000];
int count = (int)(fs.Length / 50000);
for (int i = 0; i <= count - 1; i++)
{
fs.Read(bt_data, 0, bt_data.Length);
SendVarData(client, bt_data);
//整包发送完,停顿0.05s
Thread.Sleep(50);
}
//发送余包
byte[] bt_dataleft = new byte[fs.Length % 500000];
fs.Read(bt_dataleft, 0, bt_dataleft.Length);
SendVarData(client, bt_dataleft);
}
//文件小于50000字节
else
{
//byte[]中存在元素是空
byte[] bt_data = new byte[(int)(fs.Length)];
fs.Read(bt_data, 0, (int)(bt_data.Length));
SendVarData(client, bt_data);
}
//每次传完一个文件,必须关闭Socket,否则多个文件的内容会写到一个文件中去。
fs.Close();
client.Close();
}
}
//发送文件夹中所有子文件
private void UpLoadFolder()
{
DirectoryInfo di = new DirectoryInfo(fb.SelectedPath);
foreach (FileInfo fi in di.GetFiles())
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.44"), 8888);
client.Connect(ipPoint);
//发送文件名
string filename = fi.Name;
byte[] bt_filename = System.Text.Encoding.Unicode.GetBytes(filename);
SendVarData(client, bt_filename);
byte[] bt_data = new byte[50000];
FileStream fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
//文件大于50000字节
if (fs.Length >= 50000)
{
//发送整包
int count = (int)(fs.Length / 50000);
for (int i = 0; i <= count - 1; i++)
{
fs.Read(bt_data, 0, bt_data.Length);
SendVarData(client, bt_data);
//整包发送完,停顿0.05s
Thread.Sleep(50);
}
//发送余包
byte[] bt_dataleft = new byte[fs.Length % 500000];
fs.Read(bt_dataleft, 0, bt_dataleft.Length);
SendVarData(client, bt_dataleft);
}
//文件小于50000字节
else
{
//byte[]中存在元素是空
fs.Read(bt_data, 0, bt_data.Length);
SendVarData(client, bt_data);
}
//每次传完一个文件,必须关闭Socket,否则多个文件的内容会写到一个文件中去。
fs.Close();
client.Close();
}
}
private void StartReceive()
{
//监听所有ip
//IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888);
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.44"), 8888);
TcpListener tcpListener = new TcpListener(ipPoint);
tcpListener.Start();
while (true)
{
//如果没有Connect请求
if (!tcpListener.Pending())
{
Thread.Sleep(1000);
continue;
}
//如果有Connect请求
//创建接收端Socket
Socket client = tcpListener.AcceptSocket();
byte[] byte_filename = ReceiveVarData(client);
string filename = System.Text.Encoding.Unicode.GetString(byte_filename);
//创建文件
FileStream fs = new FileStream(dir + "\\" + filename, FileMode.OpenOrCreate, FileAccess.Write);
//向文件中写入数据
while (true)
{
//每次后台返回的就只是一部分
byte[] data = ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
//写完一段data后,fs在文件中的位置停留在文件末尾,下次循环时,直接追加在文件结尾
fs.Write(data, 0, data.Length);
}
}
//关闭文件
fs.Close();
//每接收完一个文件,要关闭Socket,否则接收的数据被写入一个文件
client.Close();
}
}
//发送端
//接收数据
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
//这次接收是为了干嘛?!!!!!!很明显,人家这是做了一个协议。第一次取出了这个包中数据 的长度,好在接收的时候不会少接收(丢包)或多接收(粘包)。你看一下发送端,一定有一个类或结构体,
使用encoding.ascii.getbytes(长度);就可以将一个长度转换成二进制数组。此处的byte【4】就是取出原来存的数。
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;
}
//发送数据
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];
//文件名png.png 被转成了byte[14],这个是将存到datasize[0]中
datasize = BitConverter.GetBytes(size);
//第一次发出的byte数
//发文件名时,只循环了次
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;
}