Accepter TCP Client Asynchrone
Que j'ai été faire un serveur. Je suis à l'aide de TcpListener.AcceptTcpClientAsync() dans un async
méthode, mais je n'ai aucune idée de comment le faire réellement fonctionner. Mon code maintenant est:
private static async void StartServer()
{
Console.WriteLine("S: Server started on port {0}", WebVars.ServerPort);
var listener = new TcpListener(WebVars.LocalIp, WebVars.ServerPort);
listener.Start();
var client = await listener.AcceptTcpClientAsync();
}
Comment dois-je traiter le client? Dois-je juste continuer de codage et il va automatiquement faire de nouveaux fils de la même méthode, ou dois-je faire de la magie méthode qui va le faire pour moi?
Edit: code actuel:
private static Task HandleClientAsync(TcpClient client)
{
var stream = client.GetStream();
//do stuff
}
///<summary>
///Method to be used on seperate thread.
///</summary>
private static async void RunServerAsync()
{
while (true)
{
Console.WriteLine("S: Server started on port {0}", WebVars.ServerPort);
var listener = new TcpListener(WebVars.LocalIp, WebVars.ServerPort);
listener.Start();
var client = await listener.AcceptTcpClientAsync();
await HandleClientAsync(client);
}
}
Veuillez ne pas inclure de l'information sur un langage utilisé dans une question de propriété, à moins que ça n'aurait pas de sens sans elle. Tags servir à cette fin.
Ceci est lié: stackoverflow.com/questions/21013751/...
Ceci est lié: stackoverflow.com/questions/21013751/...
OriginalL'auteur Ilan321 | 2014-03-05
Vous devez vous connecter pour publier un commentaire.
Rien ne comme par magie créer des threads dédiés pour vous, bien qu'il existe certains threads utilisés pour les IO achèvement qui peut entrent en jeu, en particulier si vous ne disposez pas d'un contexte de synchronisation que vous avez besoin de retourner vers.
Vous devez décider si vous voulez que votre
StartServer
méthode pour terminer quand il a accepté un unique de connexion, ou de garder en boucle jusqu'à ce que vous avez dit d'arrêter.De toute façon, de toute évidence, vous devez décider comment gérer le client aussi. Vous pouvez soit démarrer un nouveau thread et d'utiliser les méthodes synchrones, ou vous pouvez simplement utiliser asynchrone IO se charge de tout, dans le même thread. Par exemple, pour vider les données entrantes vers un fichier:
(En supposant que le client aura juste à mettre fin à la connexion quand il est terminé d'écrire les données.) En dehors de la
File.Create
appel, ce n'est asynchrone, donc il n'y a pas besoin de créer un thread séparé.C'est juste un exemple, bien sûr - lien de la manipulation serait généralement plus compliqué. Si vos vrais besoins de manipulation de quelque chose de plus gourmands en temps de calcul, vous pouvez très bien envisager d'utiliser
Task.Run
à utiliser le pool de threads... de cette façon, il ne sera pas interférer avec acceptant plus de connexions.while
boucle, et d'obtenir de la future chaîne, de la traiter, puis de retour d'une autre chaîne ou d'un fichier.Droit - donc, vous avez besoin d'ajouter que
while
boucle à votreStartServer
méthode (que j'avais changer deRunServerAsync
, et faire revenir unTask
de sorte que tout ce qui est en l'appelant peut voir lorsqu'il sera terminé). Vous pouvez également regarder la démo HTTP RPC gestionnaire que j'ai écrit pour un "introduction async" talk: github.com/jskeet/DemoCode/blob/master/AsyncIntro/Code/... (Pas de code de production, mais il pourrait être utile pour vous.)Je vais modifier ma question et de mettre mon code actuel. Ça va fonctionner?
Vous ne voulez pas créer un nouveau port d'écoute dans la boucle - vous seulement besoin de la
AcceptTcpClientAsync
(appel et l'appel pour commencer à le manipuler) dans la boucle. Et vous ne pas envie d'attendre le résultat deHandleClientAsync
- dans le cas contraire, vous ne pouvez traiter une requête à la fois. Vous pouvez bien voulez créer une collection de "demandes en cours" (représentés par des tâches), de sorte que vous pouvez dire quand tout est fini. Encore une fois, voir le code que j'ai lié.Va faire! Merci pour l'aide!
OriginalL'auteur Jon Skeet
//tout le crédit doit aller à c# 7.0 en un mot, Joseph Albahari & Ben Albahari)
OriginalL'auteur sailfish009