服务端与客户端都在自己电脑上测试可以
但放到局域网上就会出现问题。经常传着传着就报“由于目标机器积极拒绝,无法连接”,
传是可以传啊,有时候就全部文件都传过去了。有时候就只传了一部分
这是我的客户端代码 //循环遍历获取文件夹下所有文件发送服务端
private void findFiles(FileSystemInfo info)
{
DirectoryInfo dir = info as DirectoryInfo;
FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i] as FileInfo;
//是文件
if (file != null)
{
//上载文件
string str=StartSend(file.FullName);
if (str.Length> 0)
{
this.lblErrorMsg.Text = this.lblErrorMsg.Text + "\n " + str + ",已经停止上传!";
this.timer1.Stop();
this.btnUpload.Enabled = true;
this.txtInterval.ReadOnly = false;
this.txtIP.ReadOnly = false;
return;
}else
{
//将文件删除
File.Delete(file.FullName);
}
}
//对于子目录,进行递归调用
else
{
findFiles(files[i]);
}
} }
/// <summary>
/// 发送文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns>错误信息</returns>
private string StartSend(string filePath)
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(filePath);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = 50000;
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); //指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.txtIP.Text.Trim()), 1005);
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//连接到发送端
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);
}
}
catch (Exception e)
{
return e.Message;
}
finally
{
//关闭套接字
client.Close();
//关闭文件流
EzoneStream.Close();
}
return "";
}服务端代码 private void btnStartServer_Click(object sender, EventArgs e)
{
//开启接收线程
Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
TempThread.IsBackground = true;
this.btnStartServer.Enabled = false;
} private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005")); ////创建一个套接字
//Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ////绑定套接字到端口
//server.Bind(ipep); ////开始侦听(并堵塞该线程)
//server.Listen(10); //创建网络监听
TcpListener lisner = new TcpListener(ipep); lisner.Start(); while (true)
{
try
{ ////确认连接
if (!lisner.Pending())
{
Thread.Sleep(1000);
continue;
}
Socket client = lisner.AcceptSocket(); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//while (true)
//{
// try
// {
// Socket client = server.Accept();
// //获得客户端节点对象
// IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的大小]
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); //判断文件夹是否存在
if (!Directory.Exists(txtFileSaveDir.Text + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + "\\"))
{
//文件夹不存在,创建文件夹
Directory.CreateDirectory(txtFileSaveDir.Text + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + "\\");
}
string fileFullName = txtFileSaveDir.Text + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + "\\" + SendFileName; //创建一个新文件
FileStream MyFileStream = new FileStream(fileFullName, FileMode.Create, FileAccess.Write); while (true)
{ byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//将文件信息保存至数据库
// this.fileAdd(SendFileName, fileFullName);
}
}
//关闭文件流
MyFileStream.Close(); //关闭套接字
client.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} }
但放到局域网上就会出现问题。经常传着传着就报“由于目标机器积极拒绝,无法连接”,
传是可以传啊,有时候就全部文件都传过去了。有时候就只传了一部分
这是我的客户端代码 //循环遍历获取文件夹下所有文件发送服务端
private void findFiles(FileSystemInfo info)
{
DirectoryInfo dir = info as DirectoryInfo;
FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i] as FileInfo;
//是文件
if (file != null)
{
//上载文件
string str=StartSend(file.FullName);
if (str.Length> 0)
{
this.lblErrorMsg.Text = this.lblErrorMsg.Text + "\n " + str + ",已经停止上传!";
this.timer1.Stop();
this.btnUpload.Enabled = true;
this.txtInterval.ReadOnly = false;
this.txtIP.ReadOnly = false;
return;
}else
{
//将文件删除
File.Delete(file.FullName);
}
}
//对于子目录,进行递归调用
else
{
findFiles(files[i]);
}
} }
/// <summary>
/// 发送文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns>错误信息</returns>
private string StartSend(string filePath)
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(filePath);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = 50000;
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); //指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.txtIP.Text.Trim()), 1005);
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//连接到发送端
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);
}
}
catch (Exception e)
{
return e.Message;
}
finally
{
//关闭套接字
client.Close();
//关闭文件流
EzoneStream.Close();
}
return "";
}服务端代码 private void btnStartServer_Click(object sender, EventArgs e)
{
//开启接收线程
Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
TempThread.IsBackground = true;
this.btnStartServer.Enabled = false;
} private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005")); ////创建一个套接字
//Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ////绑定套接字到端口
//server.Bind(ipep); ////开始侦听(并堵塞该线程)
//server.Listen(10); //创建网络监听
TcpListener lisner = new TcpListener(ipep); lisner.Start(); while (true)
{
try
{ ////确认连接
if (!lisner.Pending())
{
Thread.Sleep(1000);
continue;
}
Socket client = lisner.AcceptSocket(); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//while (true)
//{
// try
// {
// Socket client = server.Accept();
// //获得客户端节点对象
// IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的大小]
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); //判断文件夹是否存在
if (!Directory.Exists(txtFileSaveDir.Text + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + "\\"))
{
//文件夹不存在,创建文件夹
Directory.CreateDirectory(txtFileSaveDir.Text + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + "\\");
}
string fileFullName = txtFileSaveDir.Text + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + "\\" + SendFileName; //创建一个新文件
FileStream MyFileStream = new FileStream(fileFullName, FileMode.Create, FileAccess.Write); while (true)
{ byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//将文件信息保存至数据库
// this.fileAdd(SendFileName, fileFullName);
}
}
//关闭文件流
MyFileStream.Close(); //关闭套接字
client.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} }
解决方案 »
- 写好的程序release发布报错 ,debug模式是可以的
- 简单问题,新手求救
- ASP.NET从SQL SERVER导入导出Excel需要在服务器端安装什么组建?
- 哪位兄弟有SQL语句的设计器,或都是有调用系统提供的也可以,共享一下(顶者有分)
- .net2.0的debug和release有区别吗?
- 我编写了一个向某邮箱发送邮件的程序,请问怎么确认邮件是否已经发送成功?怎么检测输入的邮箱地址有效?
- .net中有没有解码数字证书的类啊??
- 要实现下面功能,来如何建立这个dto对象?请大家指教,请各位多多参与.
- WPF,这个控件的宽度为什么没有效果?
- 数据行删除后如何访问该行的数据!
- combobox显示多列
- DataGridView的一个小问题
这个错误应该是在连接的时候报出来,也就是这行
//连接到发送端
client.Connect(ipep);如果连接上了后,进入你下面的循环发送,应该不会报错.
但是有可能服务端会主动断开,你可以把try catch去掉调试,看到底是哪行报的错
并且服务端的那个while(true)LZ没有在多线程中去处理,,
如果正在处理一个客户端的一个接收操作,而又有一个连接的信号过来,那服务端就可能"积极拒绝"了
LZ再调试调试吧
局域网中按说也很稳定,而且还是TCP的
然后我听你的将try catch去掉竟然没有再出错了。
这是为什么?
我之前没有用做过socket传输,差不多完全看不懂,这个项目也是照搬网上的实例的。
请大虾继续指教啊
既然有过异常过,那将来还是会报那个异常,
调试的时候一般这个异常要把try去掉调试的这是多线程的处理不当造成的,有时有错,有时就没错
你的服务端代码写的,线程操作不规范,是单线程的,
至于为啥报那个错,我也不知道你多线程是怎么操作的,所以我也不太清楚原因
我看你是个循环上传的
如果上传1文件时,异常了,那么跳到2文件的上传
那么1就没上传成功
传的过程中报异常了,不太可能这个文件会没问题
你服务端的while不是一直在接收客户端的上传任务么
一个死了,catch到了,会继续下一个的
我重新照搬好了。
求大神!!!!!!!!!!!!!