Zitieren von diesem Socket-Lernprogramm :
Sockets gibt es in zwei Hauptgeschmacksrichtungen. Ein aktiver Socket ist mit einem verbunden Remote Active Socket über eine offene Daten Verbindung ... Eine passive Steckdose ist nicht verbunden, sondern erwartet ein eingehende Verbindung, die wird spawn einen neuen aktiven Socket einmal a Verbindung ist hergestellt ...
Jeder Port kann eine einzelne passive haben Steckdose gebunden an sie, warten eingehende Verbindungen und mehrere aktive Sockets, jeweils entspricht einem offenen Verbindung am Port. Es ist als ob Der Fabrikarbeiter wartet auf Neues Nachrichten ankommen (er repräsentiert die passive Buchse), und wenn einer Nachricht kommt von einem neuen Absender, er initiiert eine Korrespondenz (a Verbindung) mit ihnen durch jemand anderen delegieren (ein aktiver Socket), um das Paket tatsächlich zu lesen und antworte auf den Absender, wenn notwendig. Dies erlaubt die Fabrik Arbeiter frei zu sein, um neu zu empfangen Pakete. ...
Dann erklärt das Lernprogramm, dass der aktive Socket nach dem Herstellen einer Verbindung weiterhin Daten empfängt, bis keine verbleibenden Bytes mehr vorhanden sind, und schließt dann die Verbindung.
Was ich nicht verstanden habe, ist folgendes: Angenommen, es gibt eine eingehende Verbindung zum Port und der Sender möchte alle 20 Minuten ein paar kleine Daten senden. Wenn der aktive Socket die Verbindung schließt, wenn keine verbleibenden Bytes vorhanden sind, muss der Sender jedes Mal, wenn er Daten senden möchte, erneut eine Verbindung zum Port herstellen? Wie halten wir eine einmal etablierte Verbindung länger aufrecht? Kannst du mir sagen, was ich hier vermisse?
Meine zweite Frage ist, wer bestimmt die Grenze der gleichzeitig aktiven Sockets?
Der Sender sollte in regelmäßigen Abständen ein KEEPALIVE-Paket senden, um die Verbindung aufrecht zu erhalten. Das Format des KEEPALIVE hängt vom Protokoll ab. Es könnte so klein wie ein einzelner NULL im TCP-Datensegment sein.
Was die zweite Frage betrifft ... hängt es von der I / O ab. Wenn es E / A blockiert, möchten Sie nur eine bestimmte Anzahl von Threads auf Ihrem Computer ausführen, so dass Sie nicht viele Clients haben können. Wenn es nicht blockiert, können Sie viel mehr Clients haben. Programmiersprachen sollten sowohl blockierende als auch nicht blockierende E / A unterstützen. (Ich weiß, dass Java das tut.)
Es hängt auch von Dingen wie Bandbreite, Datentransfer für jeden Client, Speicher, Taktgeschwindigkeit usw. ab. Nicht blockierend vs. blockierend kann jedoch einen großen Unterschied in der Anzahl der Clients ausmachen, die Sie akzeptieren können. Sie können wahrscheinlich nicht mehr als 5-10 Clients blockieren, ohne dass Ihr Server abstürzt ... aber Sie können Tausende haben, wenn Sie nicht blockieren.
Bitte verwirren Sie nicht die tatsächlichen Pakete, die von der TCP / IP-Implementierung über das Netzwerk und die Interaktion zwischen Ihrem Programm und einer Bibliothek gesendet werden, die TCP / IP implementiert.
Der Socket ist nur eine Abstraktion, die Ihrem Programm von der TCP / IP-Implementierung (Bibliothek oder Kernel-OS) präsentiert wird. Sie können den Socket als Verbindung zur Pipe visualisieren (localIP: port-remoteIP: port). Ihr Programm öffnet den Socket, überträgt Daten über den Socket und schließt den Socket, wenn er nicht mehr benötigt wird, um Ressourcen freizugeben. Das ist normaler Fluss. Die TCP / IP-Implementierung kann den Socket jedoch aus eigenen gültigen Gründen schließen. Einige dieser Gründe: Netzwerkzugangs-Kabeltrennung, Netzwerk-Routingfehler, Serverausfall usw. Ihr Programm kann tcp / ip socket geschlossen finden, selbst wenn es nicht geschlossen wurde.
Nun Ihre erste Frage, was mache ich, wenn mein Programm kleine Datensegmente mit langer Pause zwischen ihnen sendet. Die Antwort ist: hängt davon ab, wie lange die Pause ist und welches Programm Sie auf der anderen Seite hört. Die meisten TCP / IP-Implementierungen haben eine Vorstellung von Verbindungstimeout, um Abstraktionen zuverlässiger Verbindungen über reale unzuverlässige Netzwerke zu ermöglichen. Wenn Ihr Programm also länger als tcp / ip timeout pausiert, wird Ihr Socket von der Library geschlossen und Sie müssen den Socket erneut öffnen. Das kann auch dazu führen, dass Sie die Kommunikation wieder neu starten, abhängig von einem Programm, das auf der anderen Seite der TCP / IP-Verbindungsleitung auf Sie wartet.
Es gibt Möglichkeiten, das tcp / ip-Timeout zu erhöhen und am Leben zu halten. Diese können als Teil der Netzwerkkonfiguration, der Server-Softwarekonfiguration am anderen Ende oder durch explizite Aufforderung zum Offenhalten des Sockets durch Einstellen der KEEPALIVE-Parameter in Ihrem tcp / ip-Bibliotheksaufruf erfolgen. Wäre es noch offen oder nicht abhängig. Die vollständigen Details darüber, wie tcp / ip den Socket geöffnet hält, sollten Sie nicht verwirren, da er nichts mit Ihrem Code zu tun hat. TCP / IP hat viele Einstellungen und verschiedene Timeouts, um Ihrem Programm die Illusion einer stabilen, zuverlässigen Verbindung zu vermitteln. Der gute Teil ist alles aus Ihrem Programmcode versteckt, solange Sie es nicht missbrauchen. Halten Sie Ihre Pause in wenigen Sekunden :) Eine Reihe von Timeout-Einstellungen funktioniert möglicherweise gut für kleine Anwendungen in einem zuverlässigen lokalen Netzwerk und funktioniert nicht für Anwendungen mit hoher Auslastung oder über Kontinentkonnektivität. Jede spezifische Situation hat ihre eigene Lösung, oft mehr als nur eine.
In dieser speziellen Frage "um einige kleine Daten alle 20 Minuten zu senden" würde ich Ihnen empfehlen, die Socket-Verbindung für jede Kommunikation zu schließen und zu öffnen. Die Zeit, um einen zu öffnen, ist weniger als eine Sekunde und sollte sich nicht auf Ihre Kommunikation auswirken. Im Gegenzug erhalten Sie weniger Komplexität in Ihrem Kommunikationsprotokoll. Receiver startet immer neu bei einer neuen Socket-Verbindung und beide Systeme können über 20 Minuten freie Ressourcen in der TCP / IP-Kommunikation genießen, wenn Sie sie nicht benötigen.
Erste Frage: Ja, sobald ein Socket geschlossen ist, müssen Sie einen Open-Befehl ausführen, um die Kommunikation erneut zu initiieren.
Zweite Frage: Sie machen. Wenn Sie möchten, können Sie 64k-Verbindungen zu Ihrem Server erstellen und Port-Erschöpfung erleiden (ich empfehle das nicht). Wie ktm5124 sagte, hängt alles von Ihrer Anwendung ab. Es gibt verschiedene Möglichkeiten, Ihren Server skalierbar zu machen, einschließlich der Verwendung von asynchronen E / A und eines Thread-Pools zur Verarbeitung von Clientanforderungen.