服务端与客户端都在自己电脑上测试可以
但放到局域网上就会出现问题。经常传着传着就报“由于目标机器积极拒绝,无法连接”,
传是可以传啊,有时候就全部文件都传过去了。有时候就只传了一部分
这是我的客户端代码 //循环遍历获取文件夹下所有文件发送服务端
        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);
                }
            }        }

解决方案 »

  1.   

    是客户端的那个try报出来的错么?
    这个错误应该是在连接的时候报出来,也就是这行
    //连接到发送端   
                    client.Connect(ipep);如果连接上了后,进入你下面的循环发送,应该不会报错.
    但是有可能服务端会主动断开,你可以把try catch去掉调试,看到底是哪行报的错
    并且服务端的那个while(true)LZ没有在多线程中去处理,,
    如果正在处理一个客户端的一个接收操作,而又有一个连接的信号过来,那服务端就可能"积极拒绝"了
    LZ再调试调试吧
      

  2.   

    http://www.cnblogs.com/furenjun/archive/2007/05/15/socketConnectionError.htmlhttp://topic.csdn.net/t/20050924/16/4291641.html
      

  3.   

    http://topic.csdn.net/u/20090119/15/79876c8a-d7e0-487e-9adb-f4d52d0cb3b6.html可能出现的情况,帖子里都列举了自己找下把
      

  4.   

    是服务端异常关闭的,LZ把服务端的try catch也去掉调试
    局域网中按说也很稳定,而且还是TCP的
      

  5.   

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

  6.   

    我晕,这个和try去掉没有关系
    既然有过异常过,那将来还是会报那个异常,
    调试的时候一般这个异常要把try去掉调试的这是多线程的处理不当造成的,有时有错,有时就没错
    你的服务端代码写的,线程操作不规范,是单线程的,
    至于为啥报那个错,我也不知道你多线程是怎么操作的,所以我也不太清楚原因
      

  7.   

    我去掉try只是异常没抛出来而已,奇怪的是,他有异常尽然也全部上传了。
      

  8.   

    有异常,不可能啊,,,
    我看你是个循环上传的
    如果上传1文件时,异常了,那么跳到2文件的上传
    那么1就没上传成功
    传的过程中报异常了,不太可能这个文件会没问题
    你服务端的while不是一直在接收客户端的上传任务么
    一个死了,catch到了,会继续下一个的
      

  9.   

    谁能给我一份socket文件传输的代码就好,
    我重新照搬好了。
    求大神!!!!!!!!!!!!!