0

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.

+0

Das ist genau das, was die zweite Zeile in main tut. Es gibt localhost/127.0.0.1 – joanlofe

+0

Darf ich fragen, warum diese Frage abgelehnt wurde? – joanlofe

Antwort

2

public Socket (InetAddress Host, int port, InetAddress Schnittstelle, int localport) throws IOException

Diese Buchse Connects an den in den ersten beiden Argumenten angegebenen Host und Port. Es stellt eine Verbindung von der lokalen Netzwerkschnittstelle und dem Port her, die von den letzten beiden Argumenten angegeben wurden.

Also, was Sie versuchen, ist eine Verbindung zu einer öffentlichen Adresse von Ihrem lokalen Host, die überhaupt keinen Sinn macht. Die letzten beiden Argumente dieses Konstruktors erfordern die Auswahl einer lokalen Schnittstelle, von der aus eine Verbindung hergestellt werden kann.


Use-Fall erklärt, diese Art der Socket-Erstellung für die Wahl:

Angenommen, Sie ein Programm schreiben, wurden in regelmäßigen Abständen an einen Drucker Fehlerprotokoll zu entleeren oder sie über einen internen Mail-Server senden. Sie sollten sicherstellen, dass Sie die nach innen gerichtete Netzwerkschnittstelle anstelle der nach außen gerichteten Netzwerkschnittstelle verwendet haben. In solchen Fällen würden Sie diese Art des Sockets konstruieren.

+0

Großartige Erklärung, jetzt verstehe ich das Problem. Danke vielmals! – joanlofe

+0

Wenn Sie eine Verbindung zu 127.0.0.1 herstellen möchten, würden Sie immer noch den Konstruktor mit zwei Argumenten verwenden und das System die lokale Bindung für sich selbst herausfinden lassen. Der einzige Anwendungsfall für vier Argumente, die ich jemals erlebt habe, ist, wenn das IP-Routing im Fall eines VPNs ein wenig Unterstützung benötigt. – EJP

Verwandte Themen