J'ai environ 5000 modem (clients légers), et je veux communiquer avec eux, un de ma méthode est comme ceci: string GetModemData(modemID)
, maintenant j'ai un port ouvert dans le serveur qui écoute le modem et j'utilise la programmation socket pour envoyer des données aux modems (appelant la fonction connexe), mais quand je veux envoyer des données à plusieurs modem en même temps et obtenir une réponse de leur part, je ne sais pas ce que je devrais faire? Je peux envoyer des données à un modem et attendre sa réponse, puis envoyer une autre donnée à d'autres modems (séquentiel), mais le problème est que le client attendrait longtemps pour obtenir la réponse (peut être un client différent veut obtenir des informations des modems donc ils seront tous attendre dans le Q ou quelque chose comme ça), je pense qu'une façon de résoudre ce problème est d'utiliser plusieurs ports et d'écouter chaque modem sur le port correspondant, mais cela prend trop de ports et peut aussi utiliser la mémoire et dépasse mon espace mémoire disponible, donc certains peuvent être perdus (est-ce vrai?). que devrait-on faire? Je pensais au parallélisme, mais je pense que ce n'est pas lié je devrais attendre un port, parce que je ne sais pas devrait transmettre les données reçues à quel client. J'utilise asp.net.Comment se connecter à des modems avec des clients tcp, sur plusieurs ports ou d'une autre manière?
actuellement je fais comme ceci:
private void StartListener()
{
ModemTcpListener = new TcpListener(ModemPort);
//ClientTcpListener = new TcpListener(ClientPort);
ModemTcpListener.Start();
ModemTcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptModemCallback), ModemTcpListener);
}
et en retour
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????
}
et:
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)
{
}
}
Que faites-vous dans le DoAcceptModemCallback? –
Maintenant, ce que vous devriez faire est de garder une référence à l'objet modem dans une liste, mais vous avez toujours le problème d'identifier les modems, l'application de modem est-elle à vous, je veux dire avez-vous écrit cette application? Parce que si vous le faites, vous devriez laisser le modem vous envoyer une identification quand il se connecte au serveur. –
@A_Nablsi, Modem est ma classe, je peux les suivre, mais chez les clients j'ai un problème (pas de clients légers, les modems sont des clients légers) j'ai trouvé une solution mais c'est compliqué, car je vais faire trop d'algorithmes d'analyse pour trouver un moyen simple, maintenant je vais trop dormir: D –