首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

TcpClient发送文件有关问题

2013-03-14 
TcpClient发送文件问题本帖最后由 pwm812 于 2013-01-09 09:49:30 编辑现在有一个问题,就是发送文件的时候

TcpClient发送文件问题
本帖最后由 pwm812 于 2013-01-09 09:49:30 编辑 现在有一个问题,就是发送文件的时候,一般小文件(150KB以下的没问题),但是超过这个大小的时候就会卡在150KB左右,不管你文件多大,都会卡在这里,不知道怎么回事,我在想是不是服务器没有接收而堵塞了,但是也没有报错,纠结了很久,求大虾们帮助!!



发送方法
public void SendFile(IPEndPoint ipRemote, string sFilePath)
        {
            int iReadLen;
            byte[] fileData;
            NetworkStream nStream;
            //try
            //{
                tClient = new TcpClient(ipRemote.Address.ToString(), ipRemote.Port);
                tClient.SendBufferSize = Settings.iMaxBufferSize;
                FileStream fStream = new FileStream(sFilePath, FileMode.Open);
                nStream = tClient.GetStream();
                do
                {
                    fileData = new byte[Settings.iMaxBufferSize];
                    iReadLen = fStream.Read(fileData, 0, fileData.Length);
                    SendNow(fileData,iReadLen);
                    //nStream.Write(fileData, 0, iReadLen);
                    if (SendPartCompleted != null)
                        SendPartCompleted(iReadLen);

                } while (iReadLen > 0);
                nStream.Flush();
                fStream.Close();
                nStream.Close();
                if (SendAllCompleted != null)
                    SendAllCompleted();
            //}
            //catch (Exception e)
            //{
            //}
        }

void SendNow(byte[] data, int iReadLen)


        {
            int iSurplusLen = data.Length;
            while (iSurplusLen > 0)
            {
                if (tClient.Client.Poll(5000, SelectMode.SelectWrite))
                {
                    int iSendLen = tClient.Client.Send(data, 0, iReadLen, SocketFlags.None);
                    iSurplusLen -= iSendLen;
                }
            }
        }




接收方法

public void RecFile(string sFilePath)
        {
            byte[] binData;
            int iReadLen = 0;
            long iReadedLen = 0;
            NetworkStream nStream;
            string sTmpFliePath = sFilePath + ".gzeeTmp";
            //try
            //{
                TcpClient tcp = listener.AcceptTcpClient();
                if (tcp == null)
                    return;
                tcp.ReceiveBufferSize = Settings.iMaxBufferSize;
                FileStream fs = new System.IO.FileStream(sTmpFliePath, System.IO.FileMode.Create);
                nStream = tcp.GetStream();
                do
                {
                    binData = new byte[Settings.iMaxBufferSize];
                    iReadLen = nStream.Read(binData, 0, binData.Length);
                    iReadedLen += iReadLen;
                    fs.Write(binData, 0, iReadLen);
                    fs.Flush();


                } while (iReadLen >0);
                nStream.Flush();
                nStream.Close();
                tcp.Close();
                fs.Close();
                File.Move(sTmpFliePath, sFilePath);
                if (ReceiveAllCompleted != null)
                    ReceiveAllCompleted();
            //}
            //catch (Exception e)
            //{
            //}
        }


[解决办法]
服务器对上传文件大小做限制了?看看下面的解决办法对你有用吗?

=============================
解决办法:(windows2003Server)
1、先在服务里关闭 iis admin service 服务。
2、找到 windows\system32\inetsrv\ 下的 metabase.xml 文件。
3、用纯文本方式打开,找到 ASPMaxRequestEntityAllowed 把它修改为需要的值(可修改为10M即:10240000),默认为:204800,即:200K。
4、存盘,然后重启 iis admin service 服务。
在 IIS 6.0 中,无法下载超过4M的附件时,可以按以下步骤解决:
1、先在服务里关闭 iis admin service 服务。
2、找到 windows\system32\inetsrv\ 下的 metabase.xml 文件。
3、用纯文本方式打开,找到 AspBufferingLimit 把它修改为需要的值(可修改为20M即:20480000)。
4、存盘,然后重启 iis admin service 服务。

[解决办法]
如果解决了,麻烦你贴一下代码哦!我们学习一下,嘿嘿……

热点排行