У меня около 5000 модемов (тонких клиентов), и я хочу общаться с ними, один из моих методов такой: string GetModemData(modemID)
, теперь у меня есть открытый порт на сервере, который слушает модем, и я с помощью программирования сокетов для отправки данных на модемы (вызов связанной функции), но когда я хочу отправить данные на несколько модемов одновременно и получить от них ответ, я не знаю, что мне делать? Я могу отправить данные на один модем и ждать его ответа, а затем отправить другие данные на другие модемы (последовательные), но проблема в том, что клиент должен долго ждать ответа (может быть другой клиент хочет получить некоторую информацию от модемов) так что все они будут ждать Q или что-то в этом роде), я думаю, что один из способов решения этой проблемы - использовать несколько портов и прослушивать для каждого модема связанный порт, но это занимает слишком много портов, а также может привести к использованию памяти увеличивать и превышать объем доступной памяти, так что может произойти потеря (это правда?). что делать? Я думал о Параллелизме, но я думаю, что это не связано, я должен ждать один порт, потому что я не знаю, должен ли передавать текущие полученные данные какому клиенту. Я использую asp.net.
В настоящее время я делаю так:
private void StartListener()
{
ModemTcpListener = new TcpListener(ModemPort);
//ClientTcpListener = new TcpListener(ClientPort);
ModemTcpListener.Start();
ModemTcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptModemCallback), ModemTcpListener);
}
и взамен
private void DoReadModemCallback(IAsyncResult ar)
{
try
{
bool bRet = ar.AsyncWaitHandle.WaitOne(420000);
Modem modem = ar.AsyncState as Modem;
if (!bRet || modem == null)
{
return;
}
}
catch{}
// now send data to which client?????? if i'm going to use async????
}
и:
private void DoAcceptModemCallback(IAsyncResult ar)
{
try
{
ModemTcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptModemCallback), ModemTcpListener);
TcpClient tcpClient = ModemTcpListener.EndAcceptTcpClient(ar);
Modem modem= new Modem(tcpClient, "");
tcpClient.GetStream().BeginRead(modem.Buffer, 0, tcpClient.ReceiveBufferSize, new AsyncCallback(DoReadModemCallback), modem);
ModemTcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptModemCallback), ModemTcpListener);
Log.Write("a Modem connect ...");
}
catch (Exception ex)
{
}
}