Ein bisschen mit Sockets spielen Ich habe das folgende Problem gefunden. Dieses Programm:java.net.Socket-Konstruktor löst eine Socket-Ausnahme aus, wenn die 4-Parameter-Version, aber nicht die 2-Parameter-Version verwendet wird
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();
}
}
wirft die Ausnahme java.net.SocketException: Network is unreachable: connect
in der Zeile mit dem Socket-Konstruktor. Nach dem Versuch mit Telnet und Netcat habe ich jedoch überprüft, dass der Server erreichbar ist und Daten sendet. Es ist also ein Problem mit dem Konstruktor. Wenn ich es auf das folgende Programm ändern funktioniert und ist in der Lage zu verbinden:
Socket socket = new Socket(InetAddress.getByName(remoteHost), port);
Ich kann nicht verstehen, was den Unterschied macht. Soll dieser zweite Konstruktor nicht auch an einen ephemeren Port auf localhost gebunden sein, wie der erste, wenn 0 als Port übergeben wurde? Warum funktioniert das und das andere nicht?
bearbeiten: Java mit 1.8.0_112 auf Windows 10.
Das ist genau das, was die zweite Zeile in main tut. Es gibt localhost/127.0.0.1 – joanlofe
Darf ich fragen, warum diese Frage abgelehnt wurde? – joanlofe