using System;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace FileTransmit
{
public partial class FileTransmit : Form
{
delegate void changeControlState();
private void setControlState()
{
if (this.InvokeRequired)
{
this.Invoke(new changeControlState(setControlState));
return;
}
btn_Transmit.Enabled = true;
}
public FileTransmit()
{
InitializeComponent();
tex_IP1.Text = "192";
tex_IP2.Text = "168";
tex_IP3.Text = "1";
tex_IP4.Text = "109";
IPEndPoint hostEP_Server = new IPEndPoint(IPAddress.Any, 0368);
fileTranser_Server.socket_Server.Bind(hostEP_Server);
fileTranser_Server.socket_Server.Listen(5);
//开启 线程接收数据
fileTranser_Server.tReceive = new Thread(fileTranser_Server.fileReceive);
fileTranser_Server.tReceive.IsBackground = true;
fileTranser_Server.tReceive.Start();
}
//组合 数据包
private byte[] CombomBinaryArray(byte[] srcArray1, byte[] srcArray2)
{
byte[] newArray = new byte[srcArray1.Length + srcArray2.Length];
Array.Copy(srcArray1, 0, newArray, 0, srcArray1.Length);
Array.Copy(srcArray2, 0, newArray, srcArray1.Length, srcArray2.Length);
return newArray;
}
Thread tCheckLink;
IPAddress ipAddr;
IPEndPoint hostEP_Client;
Socket socket_Client;
FileTranser_Server fileTranser_Server = new FileTranser_Server();
private void Link()
{
//判断 是否正在连接
if (!fileTranser_Server.isConnected)
{
//尝试 连接远程服务器
try
{
hostEP_Client = new IPEndPoint(ipAddr, 0368);
socket_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket_Client.Connect(hostEP_Client);
fileTranser_Server.isConnected = true;
}
catch
{
MessageBox.Show("连接失败");
socket_Client.Close();
fileTranser_Server.isConnected = false;
return;
}
}
fileTranser_Server.isConnected = false;
MessageBox.Show("连接成功");
//激活 传送按钮
setControlState();
}
private void Send()
{
//尝试 数据传送
try
{
string fileExt = "null";
//判断 连接是否中断
if (!fileTranser_Server.isConnected)
{
hostEP_Client = new IPEndPoint(ipAddr, 0368);
socket_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket_Client.Connect(hostEP_Client);
fileTranser_Server.isConnected = true;
}
//声明 文件信息
byte[] fileArray;
//获取 文件路径
string filePath = tex_FilePath.Text.ToString();
string fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1);
//打开 文件
FileStream FS = File.Open(filePath, FileMode.Open);
//获取 文件数据流
byte[] tmpdata = new byte[FS.Length];
FS.Read(tmpdata, 0, tmpdata.Length);
FS.Close();
//装填 文件扩展名
//区分 非空扩展名
if (fileName.LastIndexOf(".") != -1)
fileExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
byte[] fileExtArray = Encoding.UTF8.GetBytes(fileExt);
fileArray = fileExtArray;
//装填 文件扩展名长度
byte[] fileExtLeng = Encoding.UTF8.GetBytes(fileExtArray.Length.ToString("D1"));
fileArray = CombomBinaryArray(fileExtLeng, fileArray);
//装填 文件名
//区分 非空扩展名文件
if (fileName.LastIndexOf(".") != -1)
fileName = fileName.Substring(0, fileName.LastIndexOf("."));
byte[] fileNameArray = Encoding.UTF8.GetBytes(fileName);
fileArray = CombomBinaryArray(fileNameArray, fileArray);
//装填 文件名长度
byte[] fileNameLeng = Encoding.UTF8.GetBytes(fileNameArray.Length.ToString("D2"));
fileArray = CombomBinaryArray(fileNameLeng, fileArray);
//装填 数据流长度
byte[] fileLengArray = Encoding.UTF8.GetBytes(tmpdata.Length.ToString("D10"));
fileArray = CombomBinaryArray(fileArray, fileLengArray);
//组合 文件信息与文件数据流
byte[] fileData = CombomBinaryArray(fileArray, tmpdata);
//发送 文件包
socket_Client.Send(fileData, fileData.Length, 0);
//接收 反馈信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes = 0;
while (true)
{
if (!fileTranser_Server.isConnected)
{
bytes = socket_Client.Receive(recvBytes, recvBytes.Length, 0);
recvStr = Encoding.UTF8.GetString(recvBytes);
MessageBox.Show(recvStr);
//关闭 socket
socket_Client.Shutdown(SocketShutdown.Both);
socket_Client.Close();
}
}
}
catch (Exception err)
{
}
}
private void Btn_Transmit_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(tex_FilePath.Text))
{
MessageBox.Show("文件路径为空");
return;
}
//创建 线程进行数据传送
Thread tTransmit = new Thread(Send);
tTransmit.IsBackground = true;
tTransmit.Start();
}
private void btn_Exit_Click(object sender, EventArgs e)
{
if(tCheckLink!=null)
tCheckLink.Abort();
if (fileTranser_Server.tReceive != null)
fileTranser_Server.tReceive.Abort();
fileTranser_Server.socket_Server.Dispose();
fileTranser_Server.socket_Server.Close();
fileTranser_Server.isConnected = true;
this.Dispose(true);
this.Close();
Application.Exit();
}
private void btn_Select_Click(object sender, EventArgs e)
{
//打开 文件选择窗口
OpenFileDialog openFile = new OpenFileDialog();
//读取 配置文件
string tmpPath = Environment.CurrentDirectory + "\\config.ini";
FileStream fs = new FileStream(tmpPath, FileMode.OpenOrCreate);
byte[] tmpStr = new byte[fs.Length];
fs.Read(tmpStr, 0, tmpStr.Length);
fs.Close();
//设置 初始路径为配置文件内路径
if (!string.IsNullOrEmpty(tmpStr.ToString()))
{
openFile.InitialDirectory = tmpStr.ToString();
}
//设置 文件选择类型
openFile.Filter = "All files(*.*)|*.*";
openFile.FilterIndex = 1;
openFile.RestoreDirectory = false;
if (openFile.ShowDialog() == DialogResult.OK)
{
//显示 所选路径
tex_FilePath.Text = openFile.FileName;
//记录 所选路径于配置文件
fs = new FileStream(tmpPath, FileMode.Open);
fs.Write(Encoding.UTF8.GetBytes(openFile.FileName), 0, openFile.FileName.Length);
fs.Close();
}
}
private void onKeyPress(object sender, KeyPressEventArgs e)
{
Control actCtl = this.ActiveControl;
Control nextCtl = this.GetNextControl(actCtl, true);
Control lastCtl = this.GetNextControl(actCtl, false);
//控制 输入字符
if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8)
{
e.Handled = true;
}
//自动 换栏
if (actCtl != tex_IP4)
{
if (e.KeyChar == '.')
{
nextCtl.Focus();
return;
}
if (actCtl.Text.Length == 3 && e.KeyChar != 8)
{
nextCtl.Text = "";
nextCtl.Focus();
SendKeys.Send(e.KeyChar.ToString());
}
}
if (e.KeyChar == 8 && string.IsNullOrEmpty(actCtl.Text))
{
if (actCtl != tex_IP1)
{
lastCtl.Focus();
}
}
if (e.KeyChar == 13)
{
btn_Check_Click(sender, e);
}
}
private void btn_Check_Click(object sender, EventArgs e)
{
IPAddress[] ipPool = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
lab_Hint.Visible = false;
string tmpIP = null;
//判断 文本框是否为空
foreach (Control ip in pan_IP.Controls)
{
if (string.IsNullOrEmpty(ip.Text))
{
MessageBox.Show("第" + ip.Name.ToString().Substring(ip.Name.ToString().IndexOf("P") + 1) + "段IP为空");
ip.Focus();
return;
}
//组合 IP地址
tmpIP += ip.Text;
if (ip != tex_IP4)
tmpIP += ".";
}
ipAddr = IPAddress.Parse(tmpIP);
//创建 线程连接
tCheckLink = new Thread(Link);
tCheckLink.IsBackground = true;
tCheckLink.Start();
}
private void tex_IP_TextChanged(object sender, EventArgs e)
{
btn_Transmit.Enabled = false;
lab_Hint.Visible = true;
lab_Hint.Text = "IP地址已更改,请点击Check按钮检查连接是否通畅!";
}
}
public partial class FileTranser_Server
{
public bool isConnected = false;
//创建 socket
public Socket socket_Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public Thread tReceive;
public void fileReceive()
{
while (true)
{
if (isConnected)
{
//创建 socket
Socket client = socket_Server.Accept();
//初始 变量
byte[] recvBytes = new byte[1024];
int bytes = 0;
int fileLength = 0;
int receivedLength = 0;
int fileNameLeng = 0;
int fileExtLeng = 0;
//接收 文件名长度
bytes = client.Receive(recvBytes, 2, 0);
fileNameLeng = Convert.ToInt32(Encoding.UTF8.GetString(recvBytes, 0, bytes));
//接收 文件名
bytes = client.Receive(recvBytes, fileNameLeng, 0);
string fileName = Encoding.UTF8.GetString(recvBytes, 0, bytes);
//MessageBox.Show(fileName);
//接收 文件扩展名长度
bytes = client.Receive(recvBytes, 1, 0);
fileExtLeng = Convert.ToInt32(Encoding.UTF8.GetString(recvBytes, 0, bytes));
//MessageBox.Show(fileExtLeng.ToString());
//接收 文件扩展名
bytes = client.Receive(recvBytes, fileExtLeng, 0);
string fileExt = Encoding.UTF8.GetString(recvBytes, 0, bytes);
//MessageBox.Show(fileExt);
//接收 数据流长度
bytes = client.Receive(recvBytes, 10, 0);
//MessageBox.Show(Encoding.UTF8.GetString(recvBytes, 0, bytes));
fileLength = Convert.ToInt32(Encoding.UTF8.GetString(recvBytes, 0, bytes));
//组合 文件存放路径
string filePath = Environment.CurrentDirectory + "\\" + fileName;
if (fileExt != "null")
filePath += "." + fileExt;
//创建 文件
FileStream fileStream = new FileStream(filePath, FileMode.Create);
//接收 数据流
while (receivedLength < fileLength)
{
bytes = client.Receive(recvBytes, recvBytes.Length, 0);
receivedLength += bytes;
fileStream.Write(recvBytes, 0, bytes);
}
//释放 数据流资源
fileStream.Flush();
fileStream.Close();
//反馈 文件传输完成状态
string reData = "File\n" + filePath.Substring(filePath.LastIndexOf("\\") + 1) + "\nTransmit success!";
byte[] reByte = Encoding.UTF8.GetBytes(reData);
client.Send(reByte, reByte.Length, 0);
//释放 socket
client.Shutdown(SocketShutdown.Both);
client.Close();
isConnected = false;
}
}
}
}
}
using System;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace FileTransmit
{
public partial class FileTransmit : Form
{
delegate void changeControlState();
private void setControlState()
{
if (this.InvokeRequired)
{
this.Invoke(new changeControlState(setControlState));
return;
}
btn_Transmit.Enabled = true;
}
public FileTransmit()
{
InitializeComponent();
tex_IP1.Text = "192";
tex_IP2.Text = "168";
tex_IP3.Text = "1";
tex_IP4.Text = "109";
IPEndPoint hostEP_Server = new IPEndPoint(IPAddress.Any, 0368);
fileTranser_Server.socket_Server.Bind(hostEP_Server);
fileTranser_Server.socket_Server.Listen(5);
//开启 线程接收数据
fileTranser_Server.tReceive = new Thread(fileTranser_Server.fileReceive);
fileTranser_Server.tReceive.IsBackground = true;
fileTranser_Server.tReceive.Start();
}
//组合 数据包
private byte[] CombomBinaryArray(byte[] srcArray1, byte[] srcArray2)
{
byte[] newArray = new byte[srcArray1.Length + srcArray2.Length];
Array.Copy(srcArray1, 0, newArray, 0, srcArray1.Length);
Array.Copy(srcArray2, 0, newArray, srcArray1.Length, srcArray2.Length);
return newArray;
}
Thread tCheckLink;
IPAddress ipAddr;
IPEndPoint hostEP_Client;
Socket socket_Client;
FileTranser_Server fileTranser_Server = new FileTranser_Server();
private void Link()
{
//判断 是否正在连接
if (!fileTranser_Server.isConnected)
{
//尝试 连接远程服务器
try
{
hostEP_Client = new IPEndPoint(ipAddr, 0368);
socket_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket_Client.Connect(hostEP_Client);
fileTranser_Server.isConnected = true;
}
catch
{
MessageBox.Show("连接失败");
socket_Client.Close();
fileTranser_Server.isConnected = false;
return;
}
}
fileTranser_Server.isConnected = false;
MessageBox.Show("连接成功");
//激活 传送按钮
setControlState();
}
private void Send()
{
//尝试 数据传送
try
{
string fileExt = "null";
//判断 连接是否中断
if (!fileTranser_Server.isConnected)
{
hostEP_Client = new IPEndPoint(ipAddr, 0368);
socket_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket_Client.Connect(hostEP_Client);
fileTranser_Server.isConnected = true;
}
//声明 文件信息
byte[] fileArray;
//获取 文件路径
string filePath = tex_FilePath.Text.ToString();
string fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1);
//打开 文件
FileStream FS = File.Open(filePath, FileMode.Open);
//获取 文件数据流
byte[] tmpdata = new byte[FS.Length];
FS.Read(tmpdata, 0, tmpdata.Length);
FS.Close();
//装填 文件扩展名
//区分 非空扩展名
if (fileName.LastIndexOf(".") != -1)
fileExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
byte[] fileExtArray = Encoding.UTF8.GetBytes(fileExt);
fileArray = fileExtArray;
//装填 文件扩展名长度
byte[] fileExtLeng = Encoding.UTF8.GetBytes(fileExtArray.Length.ToString("D1"));
fileArray = CombomBinaryArray(fileExtLeng, fileArray);
//装填 文件名
//区分 非空扩展名文件
if (fileName.LastIndexOf(".") != -1)
fileName = fileName.Substring(0, fileName.LastIndexOf("."));
byte[] fileNameArray = Encoding.UTF8.GetBytes(fileName);
fileArray = CombomBinaryArray(fileNameArray, fileArray);
//装填 文件名长度
byte[] fileNameLeng = Encoding.UTF8.GetBytes(fileNameArray.Length.ToString("D2"));
fileArray = CombomBinaryArray(fileNameLeng, fileArray);
//装填 数据流长度
byte[] fileLengArray = Encoding.UTF8.GetBytes(tmpdata.Length.ToString("D10"));
fileArray = CombomBinaryArray(fileArray, fileLengArray);
//组合 文件信息与文件数据流
byte[] fileData = CombomBinaryArray(fileArray, tmpdata);
//发送 文件包
socket_Client.Send(fileData, fileData.Length, 0);
//接收 反馈信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes = 0;
while (true)
{
if (!fileTranser_Server.isConnected)
{
bytes = socket_Client.Receive(recvBytes, recvBytes.Length, 0);
recvStr = Encoding.UTF8.GetString(recvBytes);
MessageBox.Show(recvStr);
//关闭 socket
socket_Client.Shutdown(SocketShutdown.Both);
socket_Client.Close();
}
}
}
catch (Exception err)
{
}
}
private void Btn_Transmit_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(tex_FilePath.Text))
{
MessageBox.Show("文件路径为空");
return;
}
//创建 线程进行数据传送
Thread tTransmit = new Thread(Send);
tTransmit.IsBackground = true;
tTransmit.Start();
}
private void btn_Exit_Click(object sender, EventArgs e)
{
if(tCheckLink!=null)
tCheckLink.Abort();
if (fileTranser_Server.tReceive != null)
fileTranser_Server.tReceive.Abort();
fileTranser_Server.socket_Server.Dispose();
fileTranser_Server.socket_Server.Close();
fileTranser_Server.isConnected = true;
this.Dispose(true);
this.Close();
Application.Exit();
}
private void btn_Select_Click(object sender, EventArgs e)
{
//打开 文件选择窗口
OpenFileDialog openFile = new OpenFileDialog();
//读取 配置文件
string tmpPath = Environment.CurrentDirectory + "\\config.ini";
FileStream fs = new FileStream(tmpPath, FileMode.OpenOrCreate);
byte[] tmpStr = new byte[fs.Length];
fs.Read(tmpStr, 0, tmpStr.Length);
fs.Close();
//设置 初始路径为配置文件内路径
if (!string.IsNullOrEmpty(tmpStr.ToString()))
{
openFile.InitialDirectory = tmpStr.ToString();
}
//设置 文件选择类型
openFile.Filter = "All files(*.*)|*.*";
openFile.FilterIndex = 1;
openFile.RestoreDirectory = false;
if (openFile.ShowDialog() == DialogResult.OK)
{
//显示 所选路径
tex_FilePath.Text = openFile.FileName;
//记录 所选路径于配置文件
fs = new FileStream(tmpPath, FileMode.Open);
fs.Write(Encoding.UTF8.GetBytes(openFile.FileName), 0, openFile.FileName.Length);
fs.Close();
}
}
private void onKeyPress(object sender, KeyPressEventArgs e)
{
Control actCtl = this.ActiveControl;
Control nextCtl = this.GetNextControl(actCtl, true);
Control lastCtl = this.GetNextControl(actCtl, false);
//控制 输入字符
if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8)
{
e.Handled = true;
}
//自动 换栏
if (actCtl != tex_IP4)
{
if (e.KeyChar == '.')
{
nextCtl.Focus();
return;
}
if (actCtl.Text.Length == 3 && e.KeyChar != 8)
{
nextCtl.Text = "";
nextCtl.Focus();
SendKeys.Send(e.KeyChar.ToString());
}
}
if (e.KeyChar == 8 && string.IsNullOrEmpty(actCtl.Text))
{
if (actCtl != tex_IP1)
{
lastCtl.Focus();
}
}
if (e.KeyChar == 13)
{
btn_Check_Click(sender, e);
}
}
private void btn_Check_Click(object sender, EventArgs e)
{
IPAddress[] ipPool = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
lab_Hint.Visible = false;
string tmpIP = null;
//判断 文本框是否为空
foreach (Control ip in pan_IP.Controls)
{
if (string.IsNullOrEmpty(ip.Text))
{
MessageBox.Show("第" + ip.Name.ToString().Substring(ip.Name.ToString().IndexOf("P") + 1) + "段IP为空");
ip.Focus();
return;
}
//组合 IP地址
tmpIP += ip.Text;
if (ip != tex_IP4)
tmpIP += ".";
}
ipAddr = IPAddress.Parse(tmpIP);
//创建 线程连接
tCheckLink = new Thread(Link);
tCheckLink.IsBackground = true;
tCheckLink.Start();
}
private void tex_IP_TextChanged(object sender, EventArgs e)
{
btn_Transmit.Enabled = false;
lab_Hint.Visible = true;
lab_Hint.Text = "IP地址已更改,请点击Check按钮检查连接是否通畅!";
}
}
public partial class FileTranser_Server
{
public bool isConnected = false;
//创建 socket
public Socket socket_Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public Thread tReceive;
public void fileReceive()
{
while (true)
{
if (isConnected)
{
//创建 socket
Socket client = socket_Server.Accept();
//初始 变量
byte[] recvBytes = new byte[1024];
int bytes = 0;
int fileLength = 0;
int receivedLength = 0;
int fileNameLeng = 0;
int fileExtLeng = 0;
//接收 文件名长度
bytes = client.Receive(recvBytes, 2, 0);
fileNameLeng = Convert.ToInt32(Encoding.UTF8.GetString(recvBytes, 0, bytes));
//接收 文件名
bytes = client.Receive(recvBytes, fileNameLeng, 0);
string fileName = Encoding.UTF8.GetString(recvBytes, 0, bytes);
//MessageBox.Show(fileName);
//接收 文件扩展名长度
bytes = client.Receive(recvBytes, 1, 0);
fileExtLeng = Convert.ToInt32(Encoding.UTF8.GetString(recvBytes, 0, bytes));
//MessageBox.Show(fileExtLeng.ToString());
//接收 文件扩展名
bytes = client.Receive(recvBytes, fileExtLeng, 0);
string fileExt = Encoding.UTF8.GetString(recvBytes, 0, bytes);
//MessageBox.Show(fileExt);
//接收 数据流长度
bytes = client.Receive(recvBytes, 10, 0);
//MessageBox.Show(Encoding.UTF8.GetString(recvBytes, 0, bytes));
fileLength = Convert.ToInt32(Encoding.UTF8.GetString(recvBytes, 0, bytes));
//组合 文件存放路径
string filePath = Environment.CurrentDirectory + "\\" + fileName;
if (fileExt != "null")
filePath += "." + fileExt;
//创建 文件
FileStream fileStream = new FileStream(filePath, FileMode.Create);
//接收 数据流
while (receivedLength < fileLength)
{
bytes = client.Receive(recvBytes, recvBytes.Length, 0);
receivedLength += bytes;
fileStream.Write(recvBytes, 0, bytes);
}
//释放 数据流资源
fileStream.Flush();
fileStream.Close();
//反馈 文件传输完成状态
string reData = "File\n" + filePath.Substring(filePath.LastIndexOf("\\") + 1) + "\nTransmit success!";
byte[] reByte = Encoding.UTF8.GetBytes(reData);
client.Send(reByte, reByte.Length, 0);
//释放 socket
client.Shutdown(SocketShutdown.Both);
client.Close();
isConnected = false;
}
}
}
}
}