tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Konstantin Preißer <>
Subject RE: 8.0.x / 7.0.x progress
Date Fri, 04 Oct 2013 21:49:33 GMT
Hi Mark,

while I was developing and experimenting with a WebSocket application (that I think could
be added to Tomcat 8's WebSocket examples), I think I found some more possible issues with
the Websocket handling. One of these can be seen with the Snake example.

A) For NIO and APR connector:
It seems that when a client establishes a Websocket connection and then stops to read data
from it (but doesn't close the connection, so that writing data to the underlying TCP connection
will be blocked), and then after some time continues to read data from the Websocket connection,
then Tomcat seems not to be able to read data from that client any more (and doesn't notice
when the connection has been closed), but it can still read from it.

To reproduce:
1) Start Tomcat (current trunk) on Windows 64-bit with Java7 64-bit and either NIO or APR
2) Open two instances of Firefox (that may or may not be on the same machine) and open the
snake example. On both instances, press up or down key so that both snakes begin moving.
3) Suspend one of the two Firefox processes (say Firefox B). This can be done with "Process
Explorer" [1] tool by right-clicking on the firefox.exe entry and select "Suspend". You can
see that Firefox B does not respond any more, but on Firefox A the snakes continue to move.
4) After some time, you can see that on Firefox A the snakes suddenly stop moving. This is
correct because the current code uses RemoteEndpoint.Basic that may block on write() methods.
5) Now resume Firefox B with Process Explorer. You can see that on both Firefoxes the snakes
will continue to move. This means that both Firefoxes are able to receive data from the Websocket
6) When you try to change the direction of the snake in Firefox A, everything works. However
on Firefox B, the snake will not change its direction. This means that while Tomcat continues
to send data to this Websocket connection, it cannot receive from it any more.
7) If you close Firefox B, then the corresponding snake will not disappear (so it seems Tomcat
doesn't notice that the connection closed).

B) For BIO connector:
I noticed that on Tomcat with BIO connector, when using a RemoteEndpoint.Async to asynchronously
send data over the WebSocket connection, sendText(String, SendHandler) (or similar methods)
will block if the Remote endpoint does not read data from the connection, whereas for NIO
and APR connector this method will always return immediately.
Is it intended that for the BIO connector those methods are blocking? As the javadoc says,
"Initiates the asynchronous transmission of a text message. This method returns before the
message is transmitted.", I would have expected that e.g. another Thread is used to write
in blocking mode, so that the sendText() method can return immediately.


Konstantin Preißer


To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message