I found this
Create ObjectOutputStream Before ObjectInputStream
If you are writing code that transmits data bidirectionally using ObjectInputStream and ObjectOutputStream, be careful to construct the ObjectOutputStream first.
If you instead construct the ObjectInputStream first, both ends will block and eventually fail in the constructor. This is because the input stream constructor waits for an initial string of bytes to arrive from the ObjectOutputStream open(). In the unidirectional case, where one side is writing and the other is reading, everything goes smoothly. However in the bidirectional case, if both sides attempt to construct the input stream first, both are waiting for the other to construct the output stream, and neither can proceed.
If your exception handling allows communications to proceed after constructing the input stream fails, then the symptoms of this problem are that both sides block for a period of time, one gets the exception and proceeds to construct the ObjectOutputStream. The other end then is able to construct its ObjectInputStream, since the initialization sequence just arrived.
Fortunately the fix is straightforward. Move the creation of the ObjectOutputStream before that of the ObjectInputStream. Then each end will transmit the initialization sequence before trying to open its input stream. The initialization sequence is ready and waiting, so the construction of the input stream goes normally, and object transfers can then commence without any delay.