WebSocket Der Remote-Endpunkt befand sich im Status [TEXT_PARTIAL_WRITING].

8

Ich benutze Tomcat 8.0.15, Frühjahr 4.1.5.

Ich habe 3 obligatorische Funktionen für die Verwendung von Websocket wie unten implementiert. Es ist sehr einfach.

%Vor%

Ein Client sendet eine Nachricht und andere Clients erhalten die Nachricht von der handleTextMessage.

In meinem Fall möchte das Serverprogramm ohne die Funktion handleTextMessage eine Textnachricht an Clients senden. (Dazu habe ich die ID und den Benutzernamen einer WebSocketSession in map_id gespeichert)

%Vor%

Der obige Code funktioniert sehr gut. Wenn jedoch die WebSocketSession eines Clients verwendet wird und versucht, sie gleichzeitig zu verwenden, wird ein Fehler ausgegeben. Es bedeutet     1. einige Client senden Nachricht - & gt; handleTextMessage wird aufgerufen - & gt; die WebSocketSession des Clients verwendet     2. Server-Programm möchte Nachricht an diesen Client senden - & gt; Holen Sie sich die WebSocketSession des Clients aus map - & gt; Versuchen Sie, eine Nachricht mit derselben WebSocketSession zu senden

%Vor%

Als Ergebnis wird WebSocketSession geschlossen und der Client muss erneut WebSocketSession öffnen.

Also, meine Frage ist:

Kann ich überprüfen, ob WebSocketSession verwendet wird oder nicht? (Außerhalb der Funktion handleTextMessage)

    
mc j 12.03.2015, 04:48
quelle

2 Antworten

11

Das Problem ist, dass mehrere Threads versuchen, gleichzeitig in den Socket zu schreiben:

versuchen:

%Vor%     
user3179515 26.03.2015 07:06
quelle
2

Während die Synchronisation von sendMessage() -Aufrufen hilft für ws: // Verbindung, hilft es nicht für wss://, i.e. SSL/TLS connection . Es ist ein 100% Fehler, wenn Sie versuchen, Teilnachrichten zu senden, während Sie Teilnachrichten lesen. Ich habe es auf Spring Boot 1.4.2 RELEASE (Tomcat 8.5.6) getestet.

Dasselbe gilt für Tomcat 8.5.9. Siehe den folgenden Trace-Stack.

%Vor%     
Oleg Fraimovich 18.12.2016 07:43
quelle

Tags und Links