2016-03-26 9 views
-1

Wenn Sie mit XMPP-Servern vertraut sind, dann müssen Sie openfire wissen. Ich habe vor, eine JSON-Version von openfire zu schreiben (imo xml ist veraltet und json ist viel schneller und openfire ist langsamer als sein Partner Tigase, aber beide haben Probleme), aber der einzige Teil, an dem ich feststecke, ist Wenn Clustering (zum Beispiel mit HazzelCast) und ein Kontakt sendet eine Nachricht an eine Instanz des Servers, aber das Ziel ist auf einer anderen Instanz, dann muss ich entweder die Verbindung freigegeben haben oder ich sollte eine Art von Speicher-basierte Warteschlange verwenden, um die zu senden Paket zum Ziel.So teilen Sie Socket-Verbindungssitzungen in Java-Servern

Ich versuchte, die Openfire Quelle zu lesen, aber es war zu kompliziert, so habe ich beschlossen, meine Frage hier zu teilen:

Wie eine einzelne TCP Connetion serveral Cluster-Servern verwenden kann Paket senden?

Ich werde Netty für ein Netzwerk-Framework verwenden.

Antwort

1

Eine TCP-Verbindung ist eine Abstraktion von zwei Paaren von IP_ADDR + PORT, einer zum Server und der andere zum Client (genauer gesagt, es ist das dem Endpunkt zugeordnete Kanalpaar). Angesichts dieser Prämisse können Sie keine TCP-Verbindung zwischen Servern mit unterschiedlichen IP-Adressen freigeben.

In Java 9 wird SO_REUSEPORT unterstützt und Sie können mehrere Server-Sockets haben, die sich das gleiche Paar IP_ADDR + PORT teilen. Soweit ich weiß, macht Netty das schon für dich.

+0

sodass Openfire und andere Clusterserver eine gemeinsam genutzte Warteschlange zum Senden von Nachrichten verwenden? – Reza

+0

Sie können viele Dinge verwenden, wenn Sie auf Systemebene arbeiten, können Sie auch eine Umleitung zum richtigen Server erreichen und den TCP-Header auf Paketebene anreichern. Lösungen können sehr unterschiedlich sein. In Java haben Sie jedoch nicht die Möglichkeit, auf dieser Ebene zu arbeiten, es sei denn, Sie tun JNI, aber an diesem Punkt tun Sie C. –

+0

Ich denke nicht, dass das funktionieren kann, weil jeder Benutzer an einem anderen Port auf einem anderen sein kann Server (für Multi-User-Chat). trotzdem danke – Reza