При первом вызове вашей программы она принимала хотя бы одно входящее соединение? Если это так, то, скорее всего, вы увидите, что сокет задерживается.
Для лучшего объяснения выкопайте копию TCP / IP, иллюстрированную Стивенсом
(источник: kohala.com )
Но, насколько я понимаю, из-за того, что приложение неправильно закрыло соединение (то есть ОБА клиент и сервер отправили свои последовательности FIN / ACK), сокет, который вы слушали, не может быть повторно использован, пока соединение не будет считаться мертвым, так называемый тайм-аут 2MSL. Значение 1 MSL может варьироваться в зависимости от операционной системы, но обычно оно составляет не менее минуты, а обычно больше 5.
Лучший совет, который я слышал, чтобы избежать этого условия (кроме того, чтобы всегда закрывать все сокеты должным образом при выходе), это установить для параметра tcp SO_LINGER значение 0 на сокете вашего сервера во время фазы listen (). Как указано в свободном пространстве, в Java это метод setReuseAddress (true).