我做成的是只可以在内网进行点对点传送文件的,现在有几点很迷惑的问题。第一是不知道要如何才能支持外网点对点进行传送。第二是如果有好几台机器都运行了接收端,那我怎么去区分他们,然后将文件只发给一个指定的接收端。下面是我在网上找到的代码:
//*******************************************发送端*********************************************
private void StartSend()
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse(this.txtFileSize2.Text);
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
this.txtFileCount.Text = PacketCount.ToString();
this.progressBar1.Maximum = PacketCount;
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
this.txtLastFileSize.Text = LastDataPacket.ToString();
////创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse(this.txtPort.Text));
////创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
////绑定套接字到端口
server.Bind(ipep);
////开始侦听(并堵塞该线程)
server.Listen(10);
//确认连接
Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得客户端的IP地址
this.txtReceiveIP.Text = clientep.Address.ToString();
//发送[文件名]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//发送[包的大小]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//发送[包的总数量]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//发送[最后一个包的大小]到客户端
CommonModule.EzoneModule.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);
//发送数据包
CommonModule.EzoneModule.SendVarData(client, data);
//显示发送数据包的个数
this.txtHasSendCount.Text = ((int)(i + 1)).ToString();
//进度条值的显示
this.progressBar1.PerformStep();
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
CommonModule.EzoneModule.SendVarData(client, data);
this.progressBar1.Value = this.progressBar1.Maximum;
} //关闭套接字
client.Close();
server.Close();
//关闭文件流
EzoneStream.Close();
this.btnSend.Enabled = true;
MessageBox.Show("文件傳送完毕!");
}
//*******************************************接收端*********************************************
private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.TxtServerIP.Text), int.Parse(this.TxtPort.Text));
//创建一个套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//開始连接
client.Connect(ipep);
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
this.txtFileName.Text = SendFileName;
//包的大小
this.txtFileSize.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
//包的大小
this.txtFileCount.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
this.progressBar1.Maximum = int.Parse(this.txtFileCount.Text);
//最後一個包的大小
this.txtLastFileSize.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
//创建一个新文件
FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write);
//已发送包的个数
int SendedCount = 0;
while (true)
{
byte[] data = CommonModule.EzoneModule.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//顯示已發送包大小
this.txtHasSendCount.Text = SendedCount.ToString();
//顯示接收進度
this.progressBar1.PerformStep();
}
}
this.progressBar1.Value = this.progressBar1.Maximum;
//關閉文件流
MyFileStream.Close();
//關閉Socket
client.Close();
this.btnReceive.Enabled = true;
MessageBox.Show("接收完畢!");
}
//*******************************************发送端*********************************************
private void StartSend()
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse(this.txtFileSize2.Text);
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
this.txtFileCount.Text = PacketCount.ToString();
this.progressBar1.Maximum = PacketCount;
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
this.txtLastFileSize.Text = LastDataPacket.ToString();
////创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse(this.txtPort.Text));
////创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
////绑定套接字到端口
server.Bind(ipep);
////开始侦听(并堵塞该线程)
server.Listen(10);
//确认连接
Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得客户端的IP地址
this.txtReceiveIP.Text = clientep.Address.ToString();
//发送[文件名]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//发送[包的大小]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//发送[包的总数量]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//发送[最后一个包的大小]到客户端
CommonModule.EzoneModule.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);
//发送数据包
CommonModule.EzoneModule.SendVarData(client, data);
//显示发送数据包的个数
this.txtHasSendCount.Text = ((int)(i + 1)).ToString();
//进度条值的显示
this.progressBar1.PerformStep();
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
CommonModule.EzoneModule.SendVarData(client, data);
this.progressBar1.Value = this.progressBar1.Maximum;
} //关闭套接字
client.Close();
server.Close();
//关闭文件流
EzoneStream.Close();
this.btnSend.Enabled = true;
MessageBox.Show("文件傳送完毕!");
}
//*******************************************接收端*********************************************
private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.TxtServerIP.Text), int.Parse(this.TxtPort.Text));
//创建一个套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//開始连接
client.Connect(ipep);
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
this.txtFileName.Text = SendFileName;
//包的大小
this.txtFileSize.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
//包的大小
this.txtFileCount.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
this.progressBar1.Maximum = int.Parse(this.txtFileCount.Text);
//最後一個包的大小
this.txtLastFileSize.Text = System.Text.Encoding.Unicode.GetString(CommonModule.EzoneModule.ReceiveVarData(client));
//创建一个新文件
FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write);
//已发送包的个数
int SendedCount = 0;
while (true)
{
byte[] data = CommonModule.EzoneModule.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//顯示已發送包大小
this.txtHasSendCount.Text = SendedCount.ToString();
//顯示接收進度
this.progressBar1.PerformStep();
}
}
this.progressBar1.Value = this.progressBar1.Maximum;
//關閉文件流
MyFileStream.Close();
//關閉Socket
client.Close();
this.btnReceive.Enabled = true;
MessageBox.Show("接收完畢!");
}
2.多个机器区分当然是用IP啦