Я стараюсь немного поиграть с сокетами. Для этого я написал очень простые «клиентские» и «серверные» приложения.
Клиент:
import java.net.*;
public class client {
public static void main(String[] args) throws Exception {
InetAddress localhost = InetAddress.getLocalHost();
System.out.println("before");
Socket clientSideSocket = null;
try {
clientSideSocket = new Socket(localhost,12345,localhost,54321);
} catch (ConnectException e) {
System.out.println("Connection Refused");
}
System.out.println("after");
if (clientSideSocket != null) {
clientSideSocket.close();
}
}
}
Сервер:
import java.net.*;
public class server {
public static void main(String[] args) throws Exception {
ServerSocket listener = new ServerSocket(12345);
while (true) {
Socket serverSideSocket = listener.accept();
System.out.println("A client-request is accepted.");
}
}
}
И я обнаружил поведение, которое не могу объяснить:
Я запускаю сервер, затем запускаю клиент. Соединение успешно установлено (клиент перестает работать, а сервер работает). Затем я закрываю сервер и запускаю его снова через секунду. После этого я запускаю клиент, и он пишет «Отказ в соединении». Мне кажется, что сервер «запоминает» старое соединение и не хочет дважды открывать второе соединение. Но я не понимаю, как это возможно. Потому что я убил предыдущий сервер и запустил новый!
Я не запускаю сервер сразу после того, как предыдущий был убит (я жду около 20 секунд). В этом случае сервер «забывает» сокет от предыдущего сервера и принимает запрос от клиента.
Я запускаю сервер, а затем запускаю клиент. Соединение установлено (сервер пишет: «Клиент-запрос принят»). Затем я подожду минуту и снова запустите клиент. И сервер (который работал все время) снова принимает запрос! Зачем? Сервер не должен принимать запрос от одного и того же IP-адреса клиента и порта клиента, но он принимает!