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

来源:互联网 发布:hash 源码 编辑:程序博客网 时间:2024/06/02 04:35
        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) 赋值不能更改数据内容,基础知识没学好啊哭

草写的,回头再修。