2012-04-09 6 views
14

java에서 소켓 서버와 소켓 클라이언트를 만들 수 있습니다. 소켓 서버 인스턴스를 실행하고 동일한 컴퓨터의 소켓 서버에서 데이터를 수신하는 소켓/서버 클라이언트를 가질 수 있습니까?동일한 컴퓨터에서 소켓 서버와 소켓 클라이언트를 실행할 수 있습니까?

예를 들어 소켓 서버는 포트 60010 에서 실행되며 소켓 클라이언트는 소켓을 통해 해당 포트에 연결하는 동일한 컴퓨터에서 실행되고 있거나 새 컴퓨터가 있어야하며 내 네트워크에 추가해야합니까? TCP/IP 계층에서 실행중인 고유 IP 주소 및 포트 번호가있는 경우

+2

네, 확실히 가능합니다. 그것을 밖으로 시도하고 자신을 위해 볼 쉽습니다. – ulmangt

답변

18

다음은 간단한 시작을위한 예제입니다. 두 스레드를 시작합니다. 하나는 ServerSocket이고 다른 하나는 Socket입니다. 하나는 연속적으로 문자열을 보내고 다른 하나는 문자열을 인쇄합니다.

이 클래스는있는 그대로 실행하면됩니다.

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class SocketTest { 
    public static void main(String[] args) throws IOException { 

     startServer(); 
     startSender(); 
    } 

    public static void startSender() { 
     (new Thread() { 
      @Override 
      public void run() { 
       try { 
        Socket s = new Socket("localhost", 60010); 
        BufferedWriter out = new BufferedWriter(
          new OutputStreamWriter(s.getOutputStream())); 

        while (true) { 
         out.write("Hello World!"); 
         out.newLine(); 
         out.flush(); 

         Thread.sleep(200); 
        } 

       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

    public static void startServer() { 
     (new Thread() { 
      @Override 
      public void run() { 
       ServerSocket ss; 
       try { 
        ss = new ServerSocket(60010); 

        Socket s = ss.accept(); 

        BufferedReader in = new BufferedReader(
          new InputStreamReader(s.getInputStream())); 
        String line = null; 
        while ((line = in.readLine()) != null) { 
         System.out.println(line); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 
+0

클라이언트와 서버가 서로 다른 프로세스에 있으면 문제가 발생할 수 있습니까? – Yola

3

예, 당신은 동일한 시스템에 다음과 같은 수 있습니다 : 다른

ServerSocket server = new ServerSocket(60010); 
Socket client = server.accept(); 

어딘가에 :

Socket socket = new Socket("localhost", 60010); 
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println("Hello server"); 
+0

동일한 포트에 2 개의 소켓을 만들 수 없습니다. –

+1

두 개의 서버 소켓을 동일한 포트에 바인딩 할 수는 없지만 동일한 포트에 여러 개의 클라이언트 소켓을 연결할 수는 있습니다 (웹 서버처럼). –

+0

웹 서버에서 서버 소켓입니다 ... 어쨌든, 당신이 그렇게 말할 때 나는 당신을 믿습니다. 내 경험에 비추어 볼 때, 나는 항상 클라이언트 소켓에 "무작위"포트 번호를 갖도록했다. –

1

예, 당신은 동일한 시스템에서 클라이언트와 서버를 실행할 수 있습니다. 나는 개발을 위해 항상 그것을한다. 그래도 문제가 발생하면 일부 라우터는 패킷을 자신에게 전달하는 데 문제가 있습니다. 개발을 위해 외부 IP 대신 localhost를 사용해보십시오.

0

예. 완전히 가능합니다. 모든 OS에는 loopback 인터페이스가 있습니다. 여러 대의 클라이언트가 컴퓨터의 한 서버에 연결할 수 있습니다. 이러한 종류의 통신은 루프백 인터페이스를 통해 이루어집니다.

관련 문제