JAVA

Socket Programming

JUN0126 2022. 5. 10. 22:34

소켓 (Socket) 이란?

 - 네트워크 상에서 수행되는 두 프로그램 간 [ (EX) Client -> Server ]의 양방향 통신 링크의 한쪽 끝 단을 의미한다.

 - 특정 포트 번호와 연결되어 있다 

   -> TCP에서 데이터를 보낼 응용 프로그램을 식별할 수 있다.

 - 서버 소켓과 클라이언트 소켓으로 분류 할 수 있다.

 

통신 방식

- 서버 IP와 서버 Port를 가진 클라이언트 서버에서 서버 Port를 가진 Server Socket으로 접속 신호를 보낸다

   서버 소켓은 또 다른 소켓을 생성하면서 클라이언트에서 요청을 보냈다 라는 인식을 하게 된다.

- 서버 소켓은 클라이언트에서 정상적으로 접속이 되었는지 여부만 파악하고 새로 생성된 소켓에서 실제 데이터들이 통신 된다.

- Clinet Socket -> Server Socket -> (서버 단에서 ) 새로 생성된 Socket

 

Socket Class

 - 클라이언트 소켓에서 사용되는 클래스

생성자 설명
Socket(InetAddress addressm, int port) 소켓을 생성하여 지정된 IP 주소와 포트 번호에 연결
Socket(String host, int port) 소켓을 생성하여 지정된 호스트와 포트 번호에 연결
호스트 이름이 null인 경우 루프백 주소(locathost) 로 가정

 

• ServerSocket Class

 - Client에서 접속이 정상적으로 되었는지 여부를 파악하는 클래스

 

public class DemoServer {
	public static void main(String[] args) throws Exception {
        int port = 3030;

		int number = Integer.parseInt(args[0]);
        String str = new String(args[1]);
        
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println(" 접속 대기 중");

		while(true){
            Socket socket = serverSocket.accept();
            System.out.println("사용자 접속 완료."); 
            // 사용자와 연결된 IP 가져오기, DemoClient에서 사용한 IP 주소값을 가져온다.
            System.out.println("클라이언트 IP " + socket.getinetAddress());  
            
            // STEP2
            // 클라이언트와 연결을 위한 스트림 생성
            OutputStream outputStream = socket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
            
            dataOutputStream.write(str);
            dataOutputStream.writeInt(number);
            
            dataOutputStream.flush();
            dataOutputStream.close();
            socket.close();
        } 
    }
}

public class DemoClient {    
	public static void main(String[] args) throws Exception {
    
        // 연결 시 소켓이 생성됨, 연결이 안될 경우 예외가 발생함
        Socket socket = new Socket("Client IP 주소", Server에 보낼 Port); 
        System.out.println("서버와 접속됨"); 
        
        // STEP2
        // Stream을 통한 데이터 읽어오기
        InputStream inputStream = socket.getInputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(inputStream);
        
        int number = dataOutputStream .readInt();
 		String str = dataOutputStream.readUTF();		 

        System.out.println("서버에서 전송된 문자 " + str); 
        System.out.println("서버에서 전송된 값 IP " + number);  
        
        dataOutputStream.close();
        inputStream.close();
        socket.close();
	}
}

DemoServer를 실행 시킨 후 DemoClient를 실행 시키면 접속대기 -> 서버와 접속됨 -> 사용자 접속 완료 순으로 확인된다.

 

에코 서버(EchoServer)

 - 미리 준비된 메세지, 클라이언트의 메시지 내용을 그대로 돌려주는 서버

 

 

1대1 채팅서버 구현

 • ChattingServer

 - 서버에 Socket과 ServerSocket 객체 설정 (포트번호 및 접속 상태 확인)

 - 클라이언트에게 데이터를 보내기 위한 스트림 생성 (생성자에 구현)

    InputStreamReader inputStreamReader = new InputStreamReader(System.in);

    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

 - 클라이언트에게 메세지를 보내기 위한 스트림 생성

    PrintWriter printWriter = new PrintWirter(socket.getOutputStream(),true);

 - 스레드를 이용하여 클라이언트 메시지 정보를 가지고 있기 implements Runnable

    Thread thr = new Thread(this) 

    thr.start(); // override한 run 메소드 실행 -> 클라이언트의 메시지를 받아서 콘솔에 출력

 

• ChttingClient

 - Socket 설정 

 - 서버로 보낼 메세지를 입력 받는 스트림

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);

   BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

 - 서버에게 메세지를 보내기 위한 스트림 생성

    PrintWriter printWriter = new PrintWirter(socket.getOutputStream(),true);

- 스레드를 이용하여 서버 메시지 정보를 가지고 있기 implements Runnable

    Thread thr = new Thread(this) 

    thr.start(); // override한 run 메소드 실행 -> 서버 메시지를 받아서 콘솔에 출력

'JAVA' 카테고리의 다른 글

Thread 생명주기 및 주요 메서드  (0) 2022.05.16
InetAddress 클래스  (0) 2022.05.05
이메일 보내기 (SMTP 방식)  (0) 2022.04.03
Retrofit2 (Java)  (0) 2022.04.02
JSON 변환 라이브러리 (Gson,Jackson)  (0) 2022.03.17