Socket
- это клиентский сокет для подключения к серверу. Чтобы открыть прослушивающий сокет для приема клиентов, вам нужно использовать вместо этого ServerSocket
, который откроет порт, если он еще не открыт, и потерпит неудачу, если порт уже используется.
public class PortCheck {
public static void main(String[] args) {
try {
ServerSocket socket = new ServerSocket(4500, 0, InetAddress.getLocalHost());
System.out.println("port available");
} catch (IOException e) {
System.out.println("port not available");
}
}
}
Когда я использовал Java, да. Но для языков с "закрытиями/делегатами/функцией", Lua в моем случае, нет который я больше не делаю, вместо этого я все больше склонялся к шаблону художественного оформления для большинства своих потребностей.
Да, я использую метод шаблона все время, в языке программирования D. Замыкание, делегаты и указатели функций по своей природе очень слабо сочетаются с базовым классом. Это хорошая вещь, когда вы хотите эту свободную муфту. С другой стороны, иногда поведение, которое вы настраиваете, по своей природе очень плотно связаны с базовым классом. Такое поведение было бы бесполезно только в каком-либо другом контексте. В тех случаях, когда эта связь необходима, шаблон-метод шаблона является самым простым способом выразить его.
Простой тест состоит в том, что вы всегда должны использовать стратегию / закрытия / делегаты / указатели функции, если связь между базовым классом и настраиваемое поведением является односторонним, то есть базовый класс вызывает настраиваемое поведение, и это его. Если настраиваемое поведение нуждается в ссылке на базовый класс, так что он может вызывать методы и т. Д., Затем шаблон метода шаблона часто является самым простым способом продолжения.
Добавлю еще один ответ, пока я пересматриваю эту тему:
Шаблонный метод лучше, чем шаблон стратегии, когда политики, которыми вы настраиваете свой базовый объект, должны знать друг о друге и могут иметь смысл только в очень ограниченном подмножестве всех возможных комбинаций. Например, допустим, в вашем базовом классе есть конкретная функция doIt()
, и крючки beforeDoIt()
, предназначенные для инициализации политик и afterDoIt()
, предназначенные для очистки политик. Вы не захотите устанавливать эти поведения независимо друг от друга, потому что они имеют смысл только в паре.