socket传输 间接性出现“由于目标机器积极拒绝,无法连接” 十万火急求高手指点
服务端与客户端都在自己电脑上测试可以但放到局域网上就会出现问题。经常传着传着就报“由于目标机器积极拒绝,无法连接”,
传是可以传啊,有时候就全部文件都传过去了。有时候就只传了一部分
这是我的客户端代码
//循环遍历获取文件夹下所有文件发送服务端
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 "";
}
服务端代码
--------------------编程问答-------------------- 是客户端的那个try报出来的错么?
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);
}
}
}
这个错误应该是在连接的时候报出来,也就是这行
//连接到发送端
client.Connect(ipep);
如果连接上了后,进入你下面的循环发送,应该不会报错.
但是有可能服务端会主动断开,你可以把try catch去掉调试,看到底是哪行报的错
并且服务端的那个while(true)LZ没有在多线程中去处理,,
如果正在处理一个客户端的一个接收操作,而又有一个连接的信号过来,那服务端就可能"积极拒绝"了
LZ再调试调试吧 --------------------编程问答-------------------- 谁来帮帮我啊~~~~ --------------------编程问答-------------------- 你直接发送信息看看呢?
--------------------编程问答-------------------- 服务器已经遇到异常关闭了连接。从服务器找错误。 --------------------编程问答-------------------- http://www.cnblogs.com/furenjun/archive/2007/05/15/socketConnectionError.html
http://topic.csdn.net/t/20050924/16/4291641.html --------------------编程问答-------------------- http://topic.csdn.net/u/20090119/15/79876c8a-d7e0-487e-9adb-f4d52d0cb3b6.html
可能出现的情况,帖子里都列举了
自己找下把 --------------------编程问答-------------------- 是服务端异常关闭的,LZ把服务端的try catch也去掉调试
局域网中按说也很稳定,而且还是TCP的 --------------------编程问答--------------------
是try报的错出来的。
然后我听你的将try catch去掉竟然没有再出错了。
这是为什么?
我之前没有用做过socket传输,差不多完全看不懂,这个项目也是照搬网上的实例的。
请大虾继续指教啊
--------------------编程问答--------------------
我晕,这个和try去掉没有关系
既然有过异常过,那将来还是会报那个异常,
调试的时候一般这个异常要把try去掉调试的
这是多线程的处理不当造成的,有时有错,有时就没错
你的服务端代码写的,线程操作不规范,是单线程的,
至于为啥报那个错,我也不知道你多线程是怎么操作的,所以我也不太清楚原因 --------------------编程问答-------------------- 确实是跟try 没关系。 --------------------编程问答-------------------- 我去掉try只是异常没抛出来而已,奇怪的是,他有异常尽然也全部上传了。 --------------------编程问答--------------------
有异常,不可能啊,,,
我看你是个循环上传的
如果上传1文件时,异常了,那么跳到2文件的上传
那么1就没上传成功
传的过程中报异常了,不太可能这个文件会没问题
你服务端的while不是一直在接收客户端的上传任务么
一个死了,catch到了,会继续下一个的 --------------------编程问答-------------------- --------------------编程问答-------------------- 谁能给我一份socket文件传输的代码就好,
我重新照搬好了。
求大神!!!!!!!!!!!!!
--------------------编程问答--------------------
自己多调试,研究多线程,自己掌握一门技术多好,
我的给你,不花几个小时跟你说,你也用不好 --------------------编程问答-------------------- 那个我在客户端发送数据时是不是要创建一个子线程呢?
那样的话感觉文件传得好慢。。 --------------------编程问答-------------------- 你的代码是
一个遍历一个目录下所有文件的循环,一个一个文件传的,
创建一个子线程也顶多主界面不会卡死,
服务端也是一个文件接收完了再能接收下一个请求,
所以,一个文件传输的快慢,创建一个子线程也没用
用多线程,可以改成服务端可以同时接收多个文件
补充:.NET技术 , C#