Best practice: Halten Sie die TCP/IP-Verbindung öffnen oder schließen Sie es nach jedem transfer?
Mein Server-App verwendet einen TIdTCPServer, mehrere Client-apps nutzen TIdTCPClients Verbindung zum server (alle Rechner sind im gleichen LAN).
Einige der clients müssen nur eine Verbindung mit dem server alle paar Minuten, andere einmal jeder zweite, und man wird dies tun, über 20 mal in der Sekunde.
Wenn ich die Verbindung zwischen einem Client und dem Server zu öffnen, werde ich speichern Sie die neu zu verbinden, sondern haben zu prüfen, ob die Verbindung verloren gegangen ist.
Wenn ich schließen Sie die Verbindung nach jeder Datenübertragung muss die Verbindung jedes mal, aber es gibt keine Notwendigkeit, zu überprüfen, ob die Verbindung noch besteht.
Was ist der beste Weg, dies zu tun?
Welche Frequenz der Datenübertragung sollte ich halten die Verbindung offen im Allgemeinen?
Welche sonstigen Vorteile /Nachteile für beide Szenarien?
- Der Aufwand der Herstellung einer neuen TCP-Verbindung ist hauptsächlich ein paar Rundfahrten. Und die sind ziemlich schnell auf LAN. Also ich würd schließen Sie die Verbindung nach ein paar Sekunden nicht nutzen.
- Aber ich würde schreiben Sie es auf die einfache Art und Weise(wahrscheinlich die sofortige Schließung) zuerst und dann prüfen, ob die Leistung zufriedenstellend ist.
- Siehe meine Antwort auf diese Frage: stackoverflow.com/questions/4872800/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, eine Mischung aus beiden. Wenn eine neue Verbindung geöffnet wird, starten Sie einen idle-timer für Sie. Sobald Daten ausgetauscht werden, den timer zurückzusetzen. Wenn der timer abgelaufen ist, schließen Sie die Verbindung (oder senden Sie einen Befehl an den client zu Fragen, wenn Sie wollen, dass die Verbindung offen bleibt). Wenn die Verbindung wurde geschlossen, wenn Daten gesendet werden müssen, öffnen Sie eine neue Verbindung und wiederholen. Auf diese Weise, die weniger Häufig genutzten verbindungen können geschlossen werden, in regelmäßigen Abständen, während die-oft genutzte verbindungen können offen bleiben.
Disconnect()
Methode. Es ist sowohl auf client - (TIdTCPClient.Disconnect()
) und server (AContext.Connection.Disconnect()
innerhalb einer server-Ereignis).Zwei Cent aus experiment...
Meine erste TCP/IP-client/server-Anwendung wurde eine neue Verbindung und einen neuen thread für jede Anforderung... vor Jahren...
Dann entdeckte ich (mit ProcessExplorer), dass es consummed einige Netzwerk-Ressourcen, da alle geschlossene Verbindung sind in der Tat nicht zerstört, sondern bleibt in einem bestimmten Zustand für einige Zeit. Eine Menge von threads erstellt wurden...
Ich hatte auch einige Probleme mit der Verbindung mit einer Menge von concurent Anfragen: ich habe nicht genug ports auf meinem server!
So Ich schrieb es, nach der HTTP/1.1-Schema, und die
KeepAlive
Funktion. Es ist viel effizienter, verwenden Sie eine kleine Anzahl von threads, und ProcessExplorer mag meinen neuen server. Und ich nie aus dem Hafen wieder. 🙂Wenn der client heruntergefahren werden, verwende ich einen ThreadPool, zumindest nicht, erstellen Sie einen thread pro client...
Kurz gesagt: wenn Sie können, halten Sie Ihr client-verbindungen am Leben für einige Minuten.
Zwar mag es in Ordnung sein, um verbinden und trennen, für eine Anwendung, die aktiv ist, einmal alle paar Minuten, die Anwendung kommuniziert mehrmals in der Sekunde wird eine performance-Steigerung, indem man die Verbindung öffnen.
Außerdem wird der code viel einfacher, wenn Sie nicht versuchen, ständig öffnen, schließen oder zu diagnostizieren eine offene Verbindung. Mit dem richtigen öffnen und schließen Sie die Logik, und SEH um Ihr lest und schreibt, es gibt keinen Grund, um zu testen, ob der socket verbunden ist, bevor Sie es verwenden, es einfach verwenden. Es wird Ihnen sagen, wenn es ein problem gibt.
Ich würde neigen zu halten, eine einzelne Verbindung öffnen, in den meisten enterprise-Anwendungen. Im Allgemeinen führen zu sauberer code, das ist einfacher zu pflegen.
/twocents
Ich denke, es hängt alles davon ab, Ihr Ziel und die Menge an Anfragen auf die server in einer bestimmten Zeit, nicht zu erwähnen, die verfügbare Bandbreite und die hardware auf dem server.
Müssen Sie denken, auch für die Zukunft, gibt es eine chance, dass in der Zukunft werden Sie brauchen verbindungen zu öffnen? wenn dem so ist, dann haben Sie Ihre eigene Frage beantwortet.
Habe ich umgesetzt, ein chat-system für ein Projekt, in dem ~50 Leute(die Zahl wächst mit jedem 2 Monaten) sind immer verbunden, und außerdem plaudert es umfasst auch den transfer von Daten Datenbank-manipulation mit Hilfe bestimmter Befehle, etc. Meine Implementierung ist, halten die Verbindung zum server offen vom Start der Anwendung bis die Anwendung geschlossen wird, keine Probleme so weit, aber wenn die Verbindung aus irgendeinem Grund wird es automatisch wiederhergestellt und weiterhin alles einwandfrei.
Insgesamt schlage ich vor, Sie versuchen beide(halten der Verbindung öffnen und schließen, nachdem es eingesetzt wird) und sehen, welche Ihren Bedürfnissen am besten passt.
Sofern Sie die Skalierung auf viele Hunderte von gleichzeitigen verbindungen würde ich definitiv halten, Sie zu öffnen - das ist bei weitem die bessere der beiden Optionen. Sobald Sie die Skala der Vergangenheit Hunderte von tausenden von gleichzeitigen verbindungen, die Sie haben können, zu löschen und erneut zu verbinden. Ich konstruierte meine gesamte Rahmen, um dieses ( http://www.csinnovations.com/framework_overview.htm ), da es mir erlaubt, die "push" - Daten, um den client vom server, Wann immer erforderlich. Sie schreiben zu müssen-ein gutes Stück code, um sicherzustellen, dass die Verbindung aufgebaut ist und funktioniert (Netzwerk-drop-outs, zeitlich pings, etc), aber wenn Sie dies tun, in Ihrem "Rahmen", dann code der Anwendung geschrieben werden können, so dass man davon ausgehen kann, dass die Verbindung ist immer "up".
Das problem ist die Grenze der threads pro Anwendung, um 1400 threads. Also max 1300 angeschlossenen clients zur gleichen Zeit,+ -.
Beim schließen der verbindungen als client den port, den du benutzt, wird nicht verfügbar sein für eine Weile. Also bei hohem Volumen sind Sie mit Lasten von verschiedenen ports. Für alles, was sich wiederholenden würde ich es offen halten.