当前位置:编程学习 > C#/ASP.NET >>

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 "";
        }

服务端代码

 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);
                }
            }

        }
--------------------编程问答-------------------- 是客户端的那个try报出来的错么?
这个错误应该是在连接的时候报出来,也就是这行
//连接到发送端   
                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的 --------------------编程问答--------------------
引用 1 楼 wangsunjun 的回复:
是客户端的那个try报出来的错么?
这个错误应该是在连接的时候报出来,也就是这行
//连接到发送端   
                client.Connect(ipep);

如果连接上了后,进入你下面的循环发送,应该不会报错.
但是有可能服务端会主动断开,你可以把try catch去掉调试,看到底是哪行报的错
并且服务端的那个while(true)LZ没有在多线程中去处理……

是try报的错出来的。
然后我听你的将try catch去掉竟然没有再出错了。
这是为什么?
我之前没有用做过socket传输,差不多完全看不懂,这个项目也是照搬网上的实例的。
请大虾继续指教啊

--------------------编程问答--------------------
引用 8 楼 hyx199012 的回复:
引用 1 楼 wangsunjun 的回复:

是客户端的那个try报出来的错么?
这个错误应该是在连接的时候报出来,也就是这行
//连接到发送端
client.Connect(ipep);

如果连接上了后,进入你下面的循环发送,应该不会报错.
但是有可能服务端会主动断开,你可以把try catch去掉调试,看到底是哪行报的错
并且服务端的那个while(true)LZ没有在多……

我晕,这个和try去掉没有关系
既然有过异常过,那将来还是会报那个异常,
调试的时候一般这个异常要把try去掉调试的

这是多线程的处理不当造成的,有时有错,有时就没错
你的服务端代码写的,线程操作不规范,是单线程的,
至于为啥报那个错,我也不知道你多线程是怎么操作的,所以我也不太清楚原因 --------------------编程问答--------------------
引用 9 楼 wangsunjun 的回复:
引用 8 楼 hyx199012 的回复:
引用 1 楼 wangsunjun 的回复:

是客户端的那个try报出来的错么?
这个错误应该是在连接的时候报出来,也就是这行
//连接到发送端
client.Connect(ipep);

如果连接上了后,进入你下面的循环发送,应该不会报错.
但是有可能服务端会主动断开,你可以把try catch去掉调试,看到底是哪行报的错
并……
确实是跟try 没关系。 --------------------编程问答-------------------- 我去掉try只是异常没抛出来而已,奇怪的是,他有异常尽然也全部上传了。 --------------------编程问答--------------------
引用 11 楼 hyx199012 的回复:
我去掉try只是异常没抛出来而已,奇怪的是,他有异常尽然也全部上传了。

有异常,不可能啊,,,
我看你是个循环上传的
如果上传1文件时,异常了,那么跳到2文件的上传
那么1就没上传成功
传的过程中报异常了,不太可能这个文件会没问题
你服务端的while不是一直在接收客户端的上传任务么
一个死了,catch到了,会继续下一个的 --------------------编程问答-------------------- --------------------编程问答-------------------- 谁能给我一份socket文件传输的代码就好,
我重新照搬好了。
求大神!!!!!!!!!!!!!
--------------------编程问答--------------------
引用 14 楼 hyx199012 的回复:
谁能给我一份socket文件传输的代码就好,
我重新照搬好了。
求大神!!!!!!!!!!!!!

自己多调试,研究多线程,自己掌握一门技术多好,
我的给你,不花几个小时跟你说,你也用不好 --------------------编程问答--------------------
引用 15 楼 wangsunjun 的回复:
引用 14 楼 hyx199012 的回复:
谁能给我一份socket文件传输的代码就好,
我重新照搬好了。
求大神!!!!!!!!!!!!!

自己多调试,研究多线程,自己掌握一门技术多好,
我的给你,不花几个小时跟你说,你也用不好
那个我在客户端发送数据时是不是要创建一个子线程呢?
那样的话感觉文件传得好慢。。 --------------------编程问答-------------------- 你的代码是
一个遍历一个目录下所有文件的循环,一个一个文件传的,
创建一个子线程也顶多主界面不会卡死,
服务端也是一个文件接收完了再能接收下一个请求,

所以,一个文件传输的快慢,创建一个子线程也没用
用多线程,可以改成服务端可以同时接收多个文件
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,