Немного со своими сокетами. Я обнаружил следующую проблему. Эта программа:java.net.Socket constructor выбрасывает исключение Socket, если используется версия с 4 параметрами, но не с 2 версией параметра
public class TestSocket {
private static final String remoteHost = "gmail-smtp-in.l.google.com";
private static final int port = 25;
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("Remote: " + InetAddress.getByName(remoteHost));
System.out.println("Local: " + InetAddress.getByName("localhost"));
Socket socket = new Socket(InetAddress.getByName(remoteHost), port, InetAddress.getByName("localhost"), 0);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter pw = new PrintWriter(out);
System.out.println("Server --> " + reader.readLine());
pw.println("helo localhost");
System.out.println("Sent 'helo localhost'");
socket.close();
}
}
бросает исключение java.net.SocketException: Network is unreachable: connect
в соответствии с конструктором сокета. Однако после попытки с помощью telnet и netcat я проверил, что сервер доступен и отправляет данные. Так что это проблема с конструктором. Когда я изменить его на следующее программа работает и имеет возможность подключения:
Socket socket = new Socket(InetAddress.getByName(remoteHost), port);
Я не могу понять, что делает разницу. Разве этот второй конструктор также не должен связываться с эфемерным портом на локальном хосте, например, первым, когда передается 0 в качестве порта? Почему один работает, а другой нет?
Редактировать: с помощью Java 1.8.0_112 на ОС Windows 10.
Это именно то, что делает вторая линия в главном. Он возвращает localhost/127.0.0.1 – joanlofe
Могу ли я спросить, почему этот вопрос был проголосован? – joanlofe