2016-07-10 8 views
0

Ich habe versucht, den Socket verwenden, um den Server zu verbinden, aber wenn ich den Parameter localhost setzen, funktioniert es. aber wenn ich dort meine IP-Adresse setzen es nie funktioniert, also ich weiß nicht, was falsch war, die IP-Adresse, die ich erhielt, war von http://whatismyipaddress.comSocket wurde nie verbunden

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Client { 

    public static void main(String [] arg) throws Exception 
    { 
     Socket  socket; 
     BufferedReader stdIn; 
     BufferedReader fromServer; 
     PrintWriter toServer; 
     String  s; 
     String  result; 

     socket = new Socket("96.63.208.240", 5000); 
     stdIn = new BufferedReader(new InputStreamReader(System.in)); 
     fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     toServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true); 
     while ((s = stdIn.readLine()) != null) 
     { 
      toServer.println(s); 
      result = fromServer.readLine(); 
      System.out.println("reverse: " + result); 
     } 
     socket.close(); 
    } 
} 

Sever Seite

import java.net.ServerSocket; 
import java.net.Socket; 

public class Server { 

    public static void main(String [] arg) throws Exception 
    { 
     ServerSocket serverSocket = new ServerSocket(5000, 10); 
     Socket  socket; 

     serverSocket.setReuseAddress(true); 
     while ((socket = serverSocket.accept()) != null) 
     { 
      System.out.println("Accepted an incoming connection"); 
      new SessionThread(socket).start(); 
     } 
     serverSocket.close(); 
    } 
} 
+0

Angenommen, dies ist in einem Heimnetzwerk - haben Sie Portweiterleitung auf Ihrem Router für Port 5000 aktiviert? – Steve101

+0

Entschuldigung, wissen Sie, wie das geht? –

+0

Wenn Sie sich bei Ihrem Router anmelden, sollte es einen Port-Weiterleitungsabschnitt geben und den Datenverkehr von Port 5000 an Ihre lokale IP leiten. – Steve101

Antwort

1

Sie haben wahrscheinlich Portweiterleitung vergessen, weil Sie angegeben haben, dass der globale IP-Router standardmäßig nicht weiß, an welches Gerät im lokalen Netzwerk er senden soll (Geräte im lokalen Netzwerk haben eine lokale IP, die Sie mit cmd finden: ipconfig). Sie teilen dem Router also manuell mit, dass er jedes Paket vom Internet an Port 5000 senden soll, um es zum Gerät mit IP zu leiten. 192.168.1.5

0

Sie müssen den Anfragefluss verstehen, um Ihr Problem zu lösen. Mit localhost machen Sie eine Anfrage direkt an Ihren Computer, er tritt nicht in das Netzwerk ein. Wenn Sie Ihre externe IP (die Sie über whatismyipaddress.com gefunden haben) setzen, wird die Anfrage Ihren Computer verlassen und Ihren Router fragen, wo sich die Maschine mit dieser IP befindet. Das heißt, wird die Anfrage Fluss sein:

  1. Computer
  2. Ihr Router
  3. ISP DNS
  4. Ihr Router wieder (weil Ihr ISP kennt Ihre IP)
  5. Ihr Computer wieder

Aber in diesem letzten Schritt gibt es ein Problem. Aus Sicherheitsgründen blockiert Ihr Router jede externe Anfrage, um auf Ihr privates Netzwerk zuzugreifen. Es gibt den Teil, wo Sie Ihre Router-Port-Weiterleitung konfigurieren müssen (wie bereits erwähnt) und sagen Sie ihm, dass jede Anfrage von außerhalb Ihres privaten Netzwerks an Ihre lokale IP-Adresse umgeleitet werden muss, dieser Weg funktioniert. Um die Portweiterleitung zu konfigurieren, müssen Sie nur über Ihren Browser auf Ihren Router zugreifen (z. B. 192.168.1.1), sich anmelden und zur Portweiterleitung oder ähnlichem gehen. Die Konfigurationsschritte sollten sehr explizit sein. Aber vergessen Sie nicht, Ihre lokale und externe Ereignis-IP kann sich ändern, wenn sie also wieder aufhört zu arbeiten, überprüfen Sie, ob die IP's gleich bleiben.

0

Versuchen Sie diesen Code: Vielleicht nützlicher für Sie.

import java.net.*; 
import java.io.*; 

public class Client { 
    public static void main (String args[]) { 
    // arguments supply message and hostname of destination 
    Socket s = null; 
     try{ 
      int serverPort = 7896; 
     s = new Socket(args[1], serverPort);  
     DataInputStream in = new DataInputStream(s.getInputStream()); 
     DataOutputStream out = 
      new DataOutputStream(s.getOutputStream()); 
     out.writeUTF(args[0]);   // UTF is a string encoding see Sn 4.3 
     String data = in.readUTF();  
     System.out.println("Received: "+ data) ;  
      }catch (UnknownHostException e){ 
      System.out.println("Sock:"+e.getMessage()); 
     }catch (EOFException e){System.out.println("EOF:"+e.getMessage()); 
      }catch (IOException e){System.out.println("IO:"+e.getMessage());} 

     if (s != null) 
      try { 
       s.close(); 
      } catch (IOException e) { 
       System.out.println("close:" + e.getMessage()); 
      } 
    } 
} 

Und für Serverseite dieses verwenden.

import java.net.*; 
import java.io.*; 

public class Server { 
    public static void main(String args[]) { 
     try { 
      int serverPort = 7896; 
      ServerSocket listenSocket = new ServerSocket(serverPort); 
      while (true) { 
       Socket clientSocket = listenSocket.accept(); 
       Connection c = new Connection(clientSocket); 
      } 
     } catch (IOException e) { 
      System.out.println("Listen :" + e.getMessage()); 
     } 
    } 
} 

class Connection extends Thread { 
    DataInputStream in; 
    DataOutputStream out; 
    Socket clientSocket; 

    public Connection(Socket aClientSocket) { 
     try { 
      clientSocket = aClientSocket; 
      in = new DataInputStream(clientSocket.getInputStream()); 
      out = new DataOutputStream(clientSocket.getOutputStream()); 
      this.start(); 
     } catch (IOException e) { 
      System.out.println("Connection:" + e.getMessage()); 
     } 
    } 

    public void run() { 
     try { // an echo server 
      String data = in.readUTF(); 
      out.writeUTF(data); 
     } catch (EOFException e) { 
      System.out.println("EOF:" + e.getMessage()); 
     } catch (IOException e) { 
      System.out.println("IO:" + e.getMessage()); 
     } 

     try { 
      clientSocket.close(); 
     } catch (IOException e) { 
      /* close failed */} 
    } 
}