2016-06-03 10 views
0

KonfigurationWebsocket blockieren eingehende Anforderung von Server

Ich habe ein Java-Client mit einem Server verbunden WebSockets verwenden. Ich benutze Netty Framework als die Websocket-Implementierung. Der Server sendet einen Ping an den Client, und der Client antwortet mit einem Pong-Frame. Wenn dies nicht geschieht, wird die Verbindung vom Server geschlossen.

Szenario

sendet Mein Client zum Server mehrere Anforderung und erwartet eine Antwort zurück. Wenn nun die Antwort der ersten Anforderung groß ist, werden die nachfolgenden Antworten und der Ping blockiert, bis der Client die erste Anforderung vollständig herunterlädt. Da der Ping ebenfalls blockiert ist, nimmt der Server an, dass die Verbindung unterbrochen ist, und erzwingt ein Schließen des Sockets. Der Client muss dann die Verbindung erneut herstellen und erneut senden, da die Antwort beim letzten Mal nicht abgeschlossen wurde.

Frage

Gibt es eine Möglichkeit, die websocket verhalten sich in einer nicht-blockierenden Art und Weise zu machen, so dass andere Antworten/ping behandelt werden können?

+0

Es klingt wie Ihr Ping-Intervall ist viel zu kurz. Wie viele Nachrichten senden Sie und wie lange dauert es, bis sie gesendet und empfangen werden? Es ist TCP, also werden Daten seriell gesendet. Ein Ping wird nicht wirklich über die Leitung gesendet, bis die großen Daten davor gesendet und bestätigt werden. Wenn das lange dauert, müssen Sie langsamer werden und nicht versuchen, einen Ping sofort zu senden, wenn die vorherigen großen Daten noch gesendet werden. – jfriend00

+0

Es ist derzeit 90 Sekunden. Aber das sollte nicht wichtig sein, denn selbst wenn ich es vergrößere, kann ich nicht kontrollieren, was die Download-Geschwindigkeit eines Clients sein soll, sagen wir mal für ein Bild. Die Bildgröße kann nicht kontrolliert werden. –

+0

Dann kann es ein Problem mit Ihrer webSocket-Bibliothek sein. Es muss nicht versucht werden, den Ping zu senden, bis eine signifikante Zeit vergangen ist, nachdem die vorherige Nachricht gesendet wurde. Was erwarten Sie von uns? Es sollte nicht direkt nach dem Senden einer Nachricht ein Ping gesendet werden.Der Ping sollte NUR nach einer gewissen Inaktivitätszeit nach dem Senden vorheriger Daten ausgehen und diese Zeit muss lang genug sein, damit ein latenter oder langsamer Client antworten kann. So muss ein Ping/Pong-System arbeiten, um effektiv zu sein und keine falschen Positives zu haben. – jfriend00

Antwort

1

Gibt es eine Möglichkeit, die Websocket in einer nicht blockierenden Weise zu verhalten, so dass , dass andere Antworten/Ping behandelt werden können?

Nicht wirklich. Ein webSocket ist ein TCP-Socket darunter. Ein TCP-Socket sendet Daten seriell. Wenn Sie große Datenmengen senden, müssen alle diese Daten geliefert werden, bevor das Paket gesendet werden kann. So funktioniert TCP. Um dies zu umgehen, verwendet ein Browser mehrere TCP-Verbindungen, wenn er mehrere Dinge gleichzeitig herunterladen möchte oder wenn der Download eines größeren Objekts nicht gleichzeitig die Fähigkeit beeinträchtigt, andere Dinge zu tun.

Ich würde argumentieren, dass ein WebSocket nicht wirklich der ideale Transport für das Senden von großen Bilddateien über langsame Verbindungen ist - besonders wenn Sie Pings und andere Daten haben, die eine gewisse Reaktionsfähigkeit über den WebSocket haben wollen.

Wahrscheinlich wäre ein besseres Schema, einfach eine URL über den webSocket zu senden und der Client dann dieses Bild über eine andere HTTP-Anfrage anzufordern, wenn es die URL erhält. Dann verwenden Sie den webSocket nur für kleinere Steuerungsnachrichten und die große Datenübertragung erfolgt über parallele HTTP-Verbindungen, die die Möglichkeit nicht beeinträchtigen, die webSocket-Verbindung weiterhin für andere Dinge zu verwenden (wie Pings oder andere Steuerungsnachrichten).

Und Sie wissen, dass HTTP, Browser und Webserver bereits für das Serving von Bildern optimiert sind (da dies die Mehrheit ihrer Bandbreitenverwendung außer Video ist).

Verwandte Themen