Как я могу получить SocketServer в Java, чтобы заблокировать используемый порт? - PullRequest
0 голосов
/ 27 мая 2011

Это мой первый вопрос, я постараюсь дать как можно больше информации.

На моем компьютере установлена ​​локальная установка Apache 2.2. У меня по умолчанию привязка к порту 100 (не спрашивайте меня, почему). Когда я запускаю Apache, я не могу создать сервер сокетов с портом 100, потому что этот порт уже используется. Я хочу продублировать эту функцию на Java-сервере, который я пишу.

В настоящее время я создаю сервер сокетов следующим образом:

ServerSocket srv = new ServerSocket(100);

Проблема в том, что это не мешает другим приложениям использовать этот порт. Я могу запустить более одной копии моего Java-приложения или даже запустить мой сервер Apache после этого. Я хочу, чтобы сокет java Server Socket имитировал поведение Apache и блокировал привязку других приложений к выбранному порту.

Я попытался использовать Google, и единственное, что я смог найти, это http://www.dreamincode.net/forums/topic/124376-block-port/, что подразумевает, что создание сервера сокетов, как показано выше, должно блокировать использование порта в других приложениях.

Я использую Windows 7 Ultimate-64bit, IDE NetBeans 6.9.1 и Java 1.6.0_23.

Спасибо, пользователь 658991,

Похоже, что порт не будет заблокирован, пока клиент не подключится или пока я не вызову ServerSocket.accept ();

try
{
    ServerSocket server = new ServerSocket(12345);
    System.out.println("Socket Server Established on port " + server.getLocalPort());
    server.accept(); // Code Stops here until connection is completed. 

    // Do Stuff
}
catch(IOException e)
{
    System.out.println("Socket Server Connection Failed!");
    System.out.println(e);
    System.exit(-1);
}

Ответы [ 8 ]

2 голосов
/ 27 мая 2011

Создание ServerSocket само по себе должно заблокировать порт. Посмотрите на свой код, где-то это может быть не так.

1 голос
/ 27 мая 2011

Вы абсолютно уверены, что ваша программа работает?Я думаю, это могло закончиться.Пожалуйста, оставьте свой полный код.Код ниже должен обязательно заблокировать порт.

ServerSocket server = new ServerSocket(3000);

while(true){
    Socket socket = server.accept();
    socket.close();
}
0 голосов
/ 29 мая 2011

Вы ошибаетесь. Создание ServerSocket предотвратит привязку других программ к этому номеру порта, пока существует ServerSocket. У Apache нет особой магии, это базовое свойство TCP. Может быть, ваш сокет собирает мусор?

0 голосов
/ 27 мая 2011

Чтобы увидеть, успешно ли связан сокет, используйте метод srv.isBound(). Это может подтвердить комментарий @biziclop.

0 голосов
/ 27 мая 2011

Имейте в виду, что у вас может быть несколько сетевых интерфейсов на хосте. Обычно у вас будет физический интерфейс и (необязательно) интерфейс обратной связи (127.0.0.1).

ServerSocket позволяет привязать все (0.0.0.0) или к конкретному с помощью ServerSocket # bind () .

Итак, на одном хосте вы можете прослушивать один и тот же порт, но на разных сетевых интерфейсах.

0 голосов
/ 27 мая 2011

Если вы вызываете метод close () объекта ServerSocket, порт больше не будет блокироваться и может использоваться связанным другими приложениями.

Если вы хотите, чтобы долгое время приложение прослушивало определенный порт, как это делает Apache, тогда ваш объект ServerSocket должен принимать соединения в одном потоке и порождать потоки для каждого полученного соединения.

Это делается путем вызова метода accept() класса ServerSocket, чтобы при каждом запросе создавался уникальный объект Socket, который затем считывался и записывался в.

0 голосов
/ 27 мая 2011

Связывает ли ServerSocket ctor с портом, или это происходит только тогда, когда вы позже вызываете «listen»? Я подозреваю, что ctor просто хранит «100» в каком-то поле.

Rgds, Martin

0 голосов
/ 27 мая 2011

Этого не должно быть.

ServerSocket ss = новый ServerSocket (9987);

если у меня есть другой процесс, который пытается ServerSocket ss = новый ServerSocket (9987);

это даст мне эту ошибку.

java.net.BindException: адрес, который уже используется: JVM_Bind в java.net.PlainSocketImpl.socketBind (собственный метод) на java.net.PlainSocketImpl.bind (неизвестный источник) на java.net.ServerSocket.bind (неизвестный источник) на java.net.ServerSocket. (Неизвестный источник) на java.net.ServerSocket. (Неизвестный источник) в MainDriver.main (MainDriver.java:15)

...