Цитата:
Всем привет!
Есть программа на сервере в нем я получаю данные с оборудования(допустим бытовой счётчик электроэнергии) и отправляю её в другое конкретное устройство(на компьютер клиента приходит значения счётчика).
Но, допустим, у нас оборвалась связь между клиентом и сервером, и через рандомное время соединение восстановилось.
Тут то и проблема образовалась.
При восстановлении соединения, данные, которые отправлял сервер, не отображается на компьютере у клиента.
Ну, по сути это и верно, не было события, которое должно было отправить последнее значение счётчика при восстановлении соединения.
|
Код:
public abstract class TcpBridge : IDisposable
{
private byte[] _data; //приватное поле для сохранения данных
private async void _MakeConnection()
{
ChangeStateConnect(StateConnect.Connect); //при восстановлении соединения
Task.Run(async () =>
{
try
{
byte[] buffer = new byte[512];
while (!_canTokRec.IsCancellationRequested) //выполняется, до обрыва связи с устройством
{
var byteCount = await tcpClient.GetStream().ReadAsync(buffer, 0, buffer.Length, canTokRec.Token);
var data = tcpDec.ReciviedPackage(buffer.Take(byteCount).ToArray());
if (data.Length > 0)
{
NewPackReceivedSend?.Invoke(tcpDec, data);// событие, когда приходит данные со счётчика. если не приходит, то равен null и событие не срабатывает.
//Отправляется данные в случайное время, обычно специально отправляю когда клиент отключается, чтобы восстановить последнее текущее соединение.
//допустим счётчик отправил последний раз строку 1456, когда связь была разорвана, но клиент не смог восстановить это значение, т.к. data=0 байт.
if (NewPackReceivedSend != null) //здесь как раз пытаюсь отловить сигнал об изменении данных
{
_data = data; //допустим я тут сохраняю нужное значение локального переменного, чтобы сохранить значение счётчика. data может принять разные данные в один момент, поэтому приходится так делать.
//данное условие выполняется и _data принимает значение 1456
}
else
{
OnChangeConnectStateSend?.Invoke(_data, tcpDec);//возникает событие, когда связь восстановилась после обрыва
//здесь и хочу отправить новые данные, но _data=null, хотя _data была =1456.
// _data используется только в этом классе и в этом методе, потому что можно предположить, что я
// в коде мог занулять _data, но такого нет.
}
}
}
}
catch(Exception e)
{
ChangeStateConnect(StateConnect.NoConnect);//метод оповещения об обрыве соединения
}
}, _canTokRec.Token);
}
}
Данный абстрактный класс использует клиент и сервер. Клиента запускаю через скомпилированный exe.
Объясните мне, пожалуйста, почему _data сначала принимает нужное значение, но при восстановлении соединения становится =null.
Было бы хорошо если объясните, как всё-таки сохранить предыдущее значение счётчика.