循环调用FTP通信时遇到的问题

        const int DELAYED = 300;                        //FTP请求延时(300ms-500ms)
        const int TIMEOUT = 1000;                       //FTP请求超时时(1000ms-3000ms)
        static byte[] buf = new byte[BUFFER_SIZE];      //FTP 数据流缓存

        object obj = new object();

        FtpWebResponse ftpWebResponse = null;
        public override void Connection(object host)
        {
        conn: if (!this.Equip.Enable)
                return;
            try
            {
                var uriBuilder = new UriBuilder(Uri.UriSchemeFtp, (string)host);
                var uri = new Uri(uriBuilder.Uri, targetFileName);
                while (true)
                {
                    var ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(uri);
                    ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                    ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                    ftpWebRequest.KeepAlive = false;
                    ftpWebRequest.UseBinary = true;
                    ftpWebRequest.UsePassive = false;
                    ftpWebRequest.Timeout = TIMEOUT;
                    ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
                    Thread.Sleep(DELAYED);                          //之前没有code1
                    buf = new byte[BUFFER_SIZE];                    //之前没有code2
                    var responseStream = ftpWebResponse.GetResponseStream();

                    responseStream.Read(buf, 0, BUFFER_SIZE);
                    responseStream.Close();
                    this.ConnState = EConnectionState.Open;
                    Thread.Sleep(500);
                }
                //goto conn;
            }
            catch (Exception ex)
            {
                Console.WriteLine("FTP Connection Exception:" + ex.Message);
                if (ex.Message.Equals("无法连接到远程服务器"))
                {
                    this.ConnState = EConnectionState.Close;
                }
                else
                {
                    if (this.ConnState != EConnectionState.Close)
                    {
                        Thread.Sleep(3000);
                        goto conn;
                    }
                }
            }

调试过程中,多次FTP通信不能保证数据的实时性。

代码运行才PC端,FTP获取的是设备异常数据,

第一次请求异常数据(正常),手动操作设备进行异常解除(同时删除设备异常数据);

第二次请求异常数据(异常),异常数据依然存在;

抓耳挠腮 

过程1:【buf】变量为多线程共用数据,试图上锁后进行测试,结果失败。

过程2:怀疑 FTP通信机制问题,通信速度过快,进行请求降速和FTP异步通信,依然没有解决问题。

过程3:【buf】数据清空,清空后数据不能,可以消除异常数据,但是因为通信速度过快,导致异常数据不能再次取得。

接下来就是没有目标的胡乱测试,导致程序代码更多bug。三天后上午重写代码结构,排除多线程影响,糊里糊涂的程序正常运行了。

回过头来看程序故障原因:

1、FTP响应需要时间,进行Thread.Sleep,不然会导致,响应的是上次的响应。

2、byte[] buf=new byte[]{}; 数组在进行 responseStream.Read(buf, 0, BUFFER_SIZE) 赋值不能更改数据内容,基础知识没学好啊哭

草写的,回头再修。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值