2016-07-10 71 views
0

我試圖使用套接字來連接服務器,但是當我把參數設置爲localhost時,它的工作原理。但是當我把我的IP地址在那裏它永遠不會奏效,所以我不知道什麼是錯的,我得到的IP地址是從http://whatismyipaddress.com插座從來沒有連接

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(); 
    } 
} 

的服務器側

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

假設這是在家庭型網絡上 - 是否啓用了端口5000上的端口轉發? – Steve101

+0

對不起,你知道該怎麼做? –

+0

如果您登錄到路由器,應該有一個端口轉發部分,並將來自端口5000的通信路由到本地IP。 – Steve101

回答

1

由於您默認指定了全局IP路由器,因此您可能忘了設置端口轉發,但不知道本地網絡中的哪個設備應發送給本地網絡(本地網絡中的設備具有本地ip,您可以使用cmd找到本地ip:ipconfig)。因此,您可以靈活地告訴路由器從互聯網發送每個包到端口5000的數據包,以將其引導至具有IP的設備,例如。 192.168.1.5

0

您需要了解請求流以解決您的問題。 與本地主機您正在向您的計算機直接發出請求,但他不會向網絡發送事件。 當你把你的外部IP(你已經通過whatismyipaddress.com找到的),請求將退出你的計算機,並詢問你的路由器在哪裏是該IP機器。這就是說,請求流量將是:

  1. 您的計算機
  2. 您的路由器
  3. ISP的DNS
  4. 再次你的路由器(因爲你的ISP知道你的IP)
  5. 您的計算機再次

但是在最後一步中存在問題。由於安全原因,您的路由器將阻止訪問您的專用網絡的任何外部請求。您必須配置路由器端口轉發的部分(如前所述),並告訴他您的私人網絡之外的任何請求必須重定向到您的本地IP,這種方式將起作用。要配置端口轉發只需通過瀏覽器訪問您的路由器(如192.168.1.1),請登錄並轉到端口轉發或類似的地方。配置步驟應該非常明確。 但是請不要忘記,您的本地和事件外部IP可以更改,因此如果它再次停止工作,請檢查IP是否保持不變。

0

試試此代碼:也許對您更有用。

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()); 
      } 
    } 
} 

而服務器端使用這一個。

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 */} 
    } 
}