Я довольно плохо знаком с сетевыми / сокетными подключениями. После прочтения множества статей и вопросов stackoverflow. я придумал другой подход и решил, что буду использовать приведенный ниже код высокого уровня для моего прослушивателя TCP Asynch
public class DeviceListener
{
private TcpListener listener = null;
public DeviceListener(Ip,PortNo)
{
listener = new TcpListener(Ip,PortNo);
}
public void StartListener()
{
listener.Start();
//TODO: Log listening started here
WaitForClients();
}
private void WaitForClients()
{
listener.BeginAcceptTcpClient(OnClientConnected, null);
}
private void OnClientConnected(IAsyncResult asyncResult)
{
WaitForClients();
TcpClient client = listener.EndAcceptTcpClient(asyncResult);
if(client != null)
{
//TODO: Log connected
HandleClientRequest(client);
}
}
private void HandleClientRequest(TcpClient client)
{
//Code to process client request
//Dispose Client
}
}
Согласно моему требованию мне нужно 2-3 слушателя. Поэтому я создаю новый экземпляр слушателей, использующих тот же IP-адрес и другой порт, которые будут входами для вышеуказанного метода. (Допустим, я использую Ip xxx.xx.xx.xx в порте 5000 и xxx.xx .xx.xx в порту 5001 )
Мой сторонний клиент (1-й клиент, прослушивающий порт 5000 и 2-й клиент, прослушивающий порт 5001), который настроен в той же сети, действует как клиент, и они отправляют сообщения KeepAlive каждую секунду , и у них есть время ожидания 500 мс
HanleClientRequestMethod высокий уровень
byte[] buffer = new byte[1024];
string data = null;
using (NetworkStream stream = client.GetStream())
{
int bytesRead;
// Loop to receive all the data sent by the client.
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
// Translate data bytes to a ASCII string.
data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
if ()//check length
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
stream.WriteAsync(byteData, 0, byteData.Length);
}
//other logic to receive data fast enough and happend in same millisecond
}
}client.Close();
Все выглядит хорошо, а сообщения Keep Alive в порядке, за исключением нескольких сценариев, которые я заметил, когда клиент говорит тайм-аут и смотрю, почему это может произойти
Из моих логов я заметил
Если два сообщения синхронизации получены в одну и ту же миллисекунду (работает в асинхронном режиме) и подтверждены также в течение одной и той же миллисекунды. Время ожидания клиента, но согласно моим журналам я вижу, как оба потока получены и подтверждены в одну и ту же миллисекунду
- В некоторых случаях я заметил, что 1-й клиентский запрос получен, 2-й клиентский запрос получен, а второй ответ отправлен, а затем отправляется первый ответ, что означает, что отправка приложения сохраняет сообщения в порядке, поскольку они асинхронны.
Но все остальное время все идет хорошо, и это также происходит случайным образом. почему вышеупомянутые сценарии случаются? почему задержка получения сообщений составляет 500 мс после отправки заявки вовремя
Пожалуйста, поделитесь своими мыслями