I found that the SHN Utility creates a separate thread for reading from EZSrve, before it writes the GetRevision string. This thread handles all input from EZSrve. Not suggesting this is a requirement, just passing on the differences. Except for the obvious of one being VB and the other Java, I don’t see anything other than the GetRevision command being written to EZSrve. In response to requests from the various GUI objects, commands for listing macros or timers, for example are written but that is far into the Utility logic.
Perhaps reading a full line (readline ?) rather than a single byte would work better. Really just grabbing at straws. My Java books are at a different house so I am doing this from a distant memory.