2016-07-10 6 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 라우터를 지정했기 때문에 로컬 네트워크 내부의 장치 (로컬 네트워크의 장치에는 cmd : ipconfig에서 찾을 수있는 로컬 IP가 있음)를 알지 못하기 때문에 포트 전달을 설정하는 것을 잊어 버렸습니다. 그래서 당신은 수동으로 IP가있는 장치로 직접 지시하기 위해 인터넷에서 포트 5000으로 오는 모든 패킷을 보내도록 라우터에게 지시합니다. 192.168.1.5

0

문제를 해결하려면 요청 흐름을 이해해야합니다. localhost으로 컴퓨터에 직접 요청하면 네트워크에 연결되지 않습니다. 외부 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 */} 
    } 
}