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 connector. 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 connection. 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. Thanks! Regards, Konstantin Preißer [1] http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org