(Edited to answer the comment)
Try declaring the socket member as transient like in
private transient Socket socket;
This will inhibit the serialization machinery from trying to send the value of socket. Note, that you cannot meaningfully send objects holding values, which represent OS resources like socket handles, over to another process. In the best case, any attempt to use such an object on the receiving side will cause an exception to be thrown. In the worst case, such an attempt might introduce subtle bugs (data being sent to the wrong user). For this reason, such objects are never serializable (except if someone made a mistake).
Consider the following (simplified) example: on UNIX, a socket is represented by an integer number (the so-called file descriptor), which is returned by the OS when the socket is created. If this value is send to another process, there are no guarantees, that this number actually refers to a valid file handle open in the receiving process. Worse, if there is a file handle with the same numeric value in the receiving process, it is almost impossible to refer to the same socket open in the sending process. So, if the number is actually used as file descriptor in the receiving process when sending data, it will almost certainly go anywhere but the intended destination.
If sending and receiving processes are on the same machine, there are ways to transfer a "socket" over from one process to the other. But I doubt, that there are easy ways to access these OS calls from Java.
currentPlayer