No se si Java soporta varios threads. De ser así, del lado del servidor podrían usar un thread para cada cliente que se conecte.
No creo que sea necesario usar un serial, con la IP basta.
Para ambos programas (cliente y servidor) debes usar sockets. Con respecto al cliente, no estoy seguro si hay alguna manera de mantener la portabilidad. Para sistemas unix puedes usar las funciones estándar encontradas en sys/socket.h. Para windows, usa winsock (winsock.h / winsock2.h).
Espero que te sirva!