c# - sockets, Umgang mit mehreren clients
Ich habe den folgenden code, die ich umsetzen will, wie mein server. So wie ich das verstehe ist es async. und sollte es ermöglichen, verbindungen von mehreren clients...
public void Start()
{
TcpListener listener = new TcpListener(IPAddress.Any, 10250);
listener.Start();
Console.WriteLine("Listening...");
while (true)
{
IAsyncResult res = listener.BeginAcceptTcpClient(HandleAsyncConnection, listener);
connectionWaitHandle.WaitOne();
}
}
private void HandleAsyncConnection(IAsyncResult res)
{
TcpListener listener = (TcpListener)res.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(res);
connectionWaitHandle.Set();
StringBuilder sb = new StringBuilder();
var data = new byte[client.ReceiveBufferSize];
using (NetworkStream ns = client.GetStream())
{
//Test reply
Byte[] replyData = System.Text.Encoding.ASCII.GetBytes(DateTime.Now.ToString());
ns.Write(replyData, 0, replyData.Length);
ns.Flush();
ns.Close();
}
client.Close();
}
Ich habe einen test app, die einfach feuert Anfragen an meinen server. Wie Sie sehen können, in den code der server antwortet mit Datum/Zeit. Die test-app sendet sagen wir 20 Anfragen, die sind einfach test-strings. Für jede dieser Anfragen es öffnet einen socket, sendet die Daten an meinen server und dann schließt den socket wieder.
Dies funktioniert gut mit einer test-app läuft. Jedoch wenn ich zwei test-apps, die zweite kann keine Verbindung zum server. Ich dachte, weil ich die Bearbeitung des Antrages async. und weil meine test-app öffnet sich, dann schließt den socket vor jedem Anruf, den ich verarbeiten könnte Anfragen von mehreren clients?
- Ich habe einige Beispiel-code, der genau das tut, was Sie wollen, aber es ist auf meinem laptop. Ich poste heute Abend wenn ich mich daran erinnere und wenn jemand nicht bereits für Sie beantwortet. Sorry für die Verspätung.
- Das wäre sehr gut, danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bearbeiten
Wenn mit >=.Net4.5, es ist besser, um die neue Netzwerk-Methoden, die es dann erlauben, die Annahme von
async
undawait
. Als solche, könnte es besser sein, Folgen Sie dem Beispiel, das ich in dieser Beitrag als Ausgangspunkt.Original-Beitrag
Folgende code veranschaulicht, wie die multiple clients asynchron ohne schleudern aus einem neuen thread pro Verbindung.
Können Sie dieses Muster für die meisten asynchronen Operationen.
//proceed
können Sie helfen mit code-Beispiel, um mehrere clients verwalten. ie-senden Nachricht an jeden einzigartig.System.Collections.Concurrent
namespace kann wirklich Erleichterung der Entwicklung hier, aber wenn Sie mit einem bestimmten problem, würde ich vorschlagen, das öffnen einer neuen Frage.async/await
. Siehe meine Antwort hier: stackoverflow.com/questions/12630827/...Die Art und Weise Sie es Taten, gibt es keinen Vorteil im Vergleich zur Verwendung von
AcceptTcpClient
. Einfach eine Schleife und erstellen einen neuen thread für jede Verbindung akzeptiert:Eine goldene Regel bei der Verwendung von asynchronen Methoden ist NICHT blockieren den Betrieb. Blockieren würde Niederlage der Zweck der Verwendung des async-ops.
NetworkStream.Write
blockieren?