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) 赋值不能更改数据内容,基础知识没学好啊。
草写的,回头再修。