it-swarm.com.de

Java-Netzwerk "Verbindung abgelehnt: Verbinden"

Ich habe versucht, ein einfaches Netzwerktestprogramm ohne Ergebnisse auszuführen.

Server:

import Java.io.*;
import Java.net.*;

public class ServerTest {
    public static void main(String[] args) {
    final int PORT_NUMBER = 44827;

    while(true) {
        try {
        //Listen on port
        ServerSocket serverSock = new ServerSocket(PORT_NUMBER);
        System.out.println("Listening...");

        //Get connection
        Socket clientSock = serverSock.accept();
        System.out.println("Connected client");

        //Get input
        BufferedReader br = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
        System.out.println(br.readLine());

        br.close();
        serverSock.close();
        clientSock.close();
        } catch(Exception e) {
        e.printStackTrace();
        }
    }
    }
}

Klient:

import Java.io.*;
import Java.net.*;

public class ClientTest {
    public static void main(String[] args) throws IOException {
    final int PORT_NUMBER = 44827;
    final String HOSTNAME = "xx.xx.xx.xx";

    //Attempt to connect
    try {
        Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
            PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
        //Output
        out.println("Test");
        out.flush();

        out.close();
        sock.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
    }
}

Das Programm funktioniert einwandfrei, wenn ich 127.0.0.1 oder meine interne IP-Adresse für den Hostnamen verwende. Wenn ich jedoch auf meine externe IP-Adresse umschalte, wird ein Java.net.ConnectException: Connection refused: connect-Fehler ausgegeben.

Ich habe mir absichtlich einen so ungewöhnlichen Port ausgesucht, um zu sehen, ob dies das Problem war, mit keinem Glück. Ich kann mich problemlos mit Telnet verbinden, aber wenn ich versuche, mit canyouseeme.org auf den Port zuzugreifen, wird mir das mitgeteilt Zeitüberschreitung der Verbindung. Ich habe sogar versucht, alle Firewalls und Antivirenprogramme einschließlich der Windows-Standard- und der Router-Firewall zu deaktivieren, wobei alle Ports weitergeleitet und DMZ aktiviert waren, und es wird immer noch die Verbindungszeit angezeigt aus. Ich verwende Comcast als ISP und bezweifle, dass sie einen solchen zufälligen Port blockieren.

Wenn ich einen Paket-Tracer verwende, zeigt er TCP -Verkehr an, wobei mein Computer SYN sendet und RST/ACK empfängt. Es sieht also aus wie ein standardmäßig blockierter Port, und es wurde kein anderer verdächtiger Paketverkehr durchgeführt. 

Ich habe keine Ahnung, was an diesem Punkt los ist. Ich habe fast jeden Trick ausprobiert, den ich kenne. Wenn jemand weiß, warum der Port blockiert ist oder das Programm zumindest funktioniert, ist dies sehr hilfreich.

10
user577304

Für was es wert ist, funktioniert Ihr Code gut auf meinem System.

Ich hasse es, es zu sagen, aber es klingt wie ein Firewall-Problem (von dem ich weiß, dass Sie bereits dreifach geprüft wurden) oder ein Comcast-Problem , was mehr möglich ist, als Sie vielleicht denken. Ich würde Ihren ISP testen .

2
mpontillo

Dieses Problem tritt in den folgenden Situationen auf:

  1. Client und Server sind nicht im Netzwerk.

  2. Server läuft nicht.

  3. Der Server läuft, überwacht den Port jedoch nicht, der Client versucht, eine Verbindung herzustellen.

  4. Firewall ist für die Kombination aus Host und Port nicht zulässig.

  5. Host-Port-Kombination ist falsch.

  6. Falsches Protokoll in Verbindungszeichenfolge.

So lösen Sie das Problem:

  1. Zuerst pingen Sie den Zielserver. Wenn das Ping-Problem ordnungsgemäß ist, , Befinden sich Client und Server beide im Netzwerk.

  2. Versuchen Sie, eine Verbindung zum Server-Host und -Port mit Telnet herzustellen. Wenn Sie In der Lage sind, eine Verbindung herzustellen, machen Sie Fehler im Clientcode.

7
Nallamachu

Wahrscheinlich wird der Server-Socket nur an die Adresse des lokalen Hosts gebunden. Sie können es mit der 3-Argument-Form des Konstruktors an eine bestimmte IP-Adresse binden. 

0
Eric Giguere

Ich gehe davon aus, dass Sie einen Router verwenden, um eine Verbindung zum Internet herzustellen. Sie sollten die Portweiterleitung durchführen, um den öffentlichen Zugriff auf Ihr internes Netzwerk zu ermöglichen. Werfen Sie einen Blick auf Wie bekommen Sie Java-Sockets für öffentliche IPs?

Ich habe auch einen Blogbeitrag über Portweiterleitung geschrieben. Vielleicht möchten Sie einen Blick darauf werfen :) http://happycoders.wordpress.com/2010/10/03/how-to-setup-a-web-server-by -dich selbst/

Aber ich konnte immer noch nicht über öffentliche IP-Adressen darauf zugreifen, da ich jetzt daran arbeite ...

0
coder9

Ich hatte das gleiche Problem, weil der Client manchmal vor dem Server gestartet wurde und beim Versuch, die Verbindung herzustellen, kein Server gefunden werden konnte. 

Meine erste (nicht so elegante) Lösung bestand darin, den Client für eine Weile mit der Schlafmethode zu stoppen:

try {
   Thread.sleep(1000);
} 
catch (InterruptedException e) {
   e.printStackTrace();
}

Ich verwende diesen Code kurz vor der Client-Verbindung, in Ihrem Beispiel vor Socket sock = new Socket(HOSTNAME, PORT_NUMBER);.

Meine zweite Lösung basierte auf this answer. Grundsätzlich habe ich eine Methode in der Client-Klasse erstellt. Diese Methode versucht, eine Verbindung zum Server herzustellen, und wenn die Verbindung fehlschlägt, wartet sie zwei Sekunden, bevor sie erneut versucht. Dies ist meine Methode:

private Socket createClientSocket(String clientName, int port){

    boolean scanning = true;
    Socket socket = null;
    int numberOfTry = 0;

    while (scanning && numberOfTry < 10){
        numberOfTry++;
        try {
            socket = new Socket(clientName, port);
            scanning = false;
        } catch (IOException e) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }

    }
    return socket;
}

Wie Sie sehen, versucht diese Methode zehn Mal, ein Socket zu erstellen, und gibt dann einen Nullwert für Socket zurück. Seien Sie also vorsichtig und prüfen Sie das Ergebnis.

Ihr Code sollte zu:

Socket sock = createClientSocket(HOSTNAME, PORT_NUMBER);
if(null == sock){ //log error... }

Diese Lösung hat mir geholfen, ich hoffe es hilft auch Ihnen. ;-)

0
Ema.jar