2012-04-13 7 views
1

Ich muss eine Anwendung erstellen, die Daten aus einem Netzwerk empfangen und diese Daten verwenden kann, um einige nicht relevante Dinge mit zu tun.Sockets in Java ...?

Hier ist ein Stück Code, um klar zu machen, was ich mache.

Auf der Serverseite:

static Socket client = null; 
static ServerSocket ss = null; 

if (ss != null) { 
       ss.close(); 
      } 
      ss = new ServerSocket(5513); 
      isrunning = true; 
      System.out.println("Waiting for client..."); 
      client = ss.accept(); 
      System.out.println("Client accepted."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 

Und die Client-Seite:

Socket client = null; 
PrintWriter out = null; 
        try {        
         client = new Socket("hostname", 5513); 
         out = new PrintWriter(client.getOutputStream(), true); 
    } 

Bitte beachten Sie, dass dies nur ein Stück des Codes ist. Es gibt keine Fehler im Code.

Nach dem Ausführen des serverseitigen Codeabschnitts wird ordnungsgemäß auf die Verbindung des Clients gewartet.

Jetzt kommt hier das Problem. Sobald ich versuche, mich von der Client-Seite aus zu verbinden, bekomme ich einen "Verbindung verweigert" -Fehler.

JEDOCH habe ich etwas im Internet gefunden, das mir gesagt hat, ich solle Telnet von der Client-Seite aus versuchen. Lassen Sie beispielsweise die serverseitige IP 192.168.1.1 lauten. Also, nach der Verwendung dieses Befehls:

telnet 192.168.1.1 5513 

Ich bekomme tatsächlich eine Verbindung mit dem Server. Der Befehl startet einen leeren Bildschirm, und alles, was ich manuell in die Befehlszeile eintippe, wird nach dem Drücken der Eingabetaste an die Server-Seite gesendet (überprüft mit Debugging).

So kann ich manuell mit der Server-Seite verbinden und einige Daten senden, aber mein Code verweigert die Verbindung.

Wer weiß, was ich falsch mache?

+0

Ich bin mir nicht sicher, warum genau Ihr scheitert, aber ich habe Sockets leicht mit diesen beiden Tutorials laufen: http://android-er.blogspot.com/2011/01/implement-simple-socket-server-in. html und http://android-er.blogspot.com/2011/01/simple-communication-using.html – HannahMitt

+0

@HannahMitt, vergaß er eine 'while' Schleife. Der Server lauscht nicht länger als eine Sekunde auf Verbindungen. Sobald der Server EINE Verbindung hergestellt hat, ist es fertig und hört nicht mehr zu. –

+0

Wie gesagt, das ist nur ein Teil des Codes. Ich verwende tatsächlich eine while-Schleife. Außerdem wartet die accept() - Methode auf die Herstellung einer Verbindung, sodass ich den Server stundenlang warten lassen kann, um die erste Verbindung herzustellen. Danach wird für eine andere Verbindung zum Start eine Schleife erstellt. –

Antwort

3

Ist dies der Code, den Sie tatsächlich verwenden?

client = new Socket("hostname", 5513); 

Versuchen Sie es zu ändern:

client = new Socket("192.168.1.1", 5513); 
+0

Das hat funktioniert! Vielen Dank. –

0

Sie verwenden nicht wirklich "Hostname" in Ihrem Socket-Objekt in dem Client bist du?

Es sollte die 192.168.1.1.

0

Sind Sie auf Windows? und wenn ja, haben Sie java.exe und javaw.exe zu Firewall mit eingehenden und ausgehenden aktiviert hinzugefügt? und hast du deiner Firewall eine Regel für 5513 hinzugefügt?

Wenn ja Windows aber keine Firewall-Einstellungen, das ist Ihre Antwort, öffnen Sie Ihre Firewall.

2

client = new Socket("hostname", 5513); Hostname muss die IP-Adresse darstellen, mit der Sie eine Verbindung herstellen. Wenn Sie versuchen, sich selbst zu verbinden, wäre es "localhost"

Auch der Server hört nicht auf den Client AT ALLES, muss es eine while Schleife sein, so dass der Server zuhört und Verbindungen akzeptiert.

while (true) { 
    client = ss.accept(); 
    out = new PrintWriter(client.getOutputStream(), true); 
    //You should probably assign it to a seperate thread to handle stuff for this client 
} 

Und ich sollte erklären, warum Sie diesen bestimmten Fehler bekommen.Wenn etwas sagt, dass die Verbindung verweigert wird, bedeutet dies normalerweise, dass die IP-Adresse, mit der Sie eine Verbindung herstellen möchten, das Senden einer Verbindung kennt und sie blockiert, weil sie nicht auf diese Verbindung gewartet hat. Wenn Sie den Server geschlossen haben, hören Sie im Grunde nicht mehr auf den Client zu, sodass alles, was an diesem Port einging, blockiert würde. Natürlich könnte der andere Fall sein, dass Java auf Ihrer Firewall blockiert wurde und eine Ausnahme dafür gemacht werden sollte. Dies ist jedoch selten der Fall, wenn das, was Sie erreichen möchten, über ein LAN erfolgt.

+0

Dies ist peinlich, ersetzt den Hostnamen mit der IP-Adresse tatsächlich funktioniert. –

+0

Das Eingeben des Hostnamens funktioniert für LAN-Verbindungen, weil ich das vorher getestet habe und es eine Verbindung herstellt. Aber für mehr Genauigkeit in Ihren Verbindungen würde ich bei IP-Adressen bleiben. Ganz zu schweigen davon, dass diese Methode einfacher und direkter ist. Ich würde nur Hostnamen für Website-Verbindungen verwenden. Die einzige Ausnahme ist "localhost", was "IP-Adresse des Arbeitsplatzes" bedeutet. –