[JAVA] TCP, UDP 통신

·2023년 10월 12일
0

JAVA

목록 보기
12/15

이제 진짜로 network 통신을 배울 차례이다.
나는 프로젝트에 채팅을 구현해야 하니까 이 파트를 열심히 공부해야 한다.
정리하면서 잘 배워 보자.

1. serverSocket 클래스

Java에서 네트워크 서버 애플리케이션을 개발하는 데 사용되는 클래스이다. 이 클래스는 TCP(전송 제어 프로토콜)를 기반으로 한 서버 소켓을 생성하고 관리하기 위해 사용된다. TCP는 연결 지향적인 프로토콜로, 데이터를 안정적으로 전송하는 데 사용된다. 서버 애플리케이션을 개발할 때, serverSocket 을 사용하여 클라이언트의 연결을 수락하고 데이터를 주고받는 소켓 통신을 구현할 수 있다. 이를 통해 네트워크 기반의 애플리케이션을 구축할 수 있다.

serverSocket 의 기능

  1. 연결 수용: ServerSocket은 클라이언트의 연결을 수락하는 데 사용된다. 서버 애플리케이션은 서버 소켓을 특정 포트에서 생성하고, 클라이언트가 해당 포트로 연결 요청을 보내면 ServerSocket은 이 연결 요청을 수락한다.
  2. 포트 번호: ServerSocket은 특정 포트 번호에 바인딩된다. 클라이언트는 해당 포트 번호로 서버에 연결하게 된다. 서로 다른 포트 번호는 서로 다른 서비스 또는 프로토콜에 대한 서버로 연결을 분리할 수 있도록 한다.
  3. 연결 대기열: ServerSocket은 동시에 여러 클라이언트 연결을 관리할 수 있도록 연결 대기열을 관리한다. 이 대기열은 연결을 기다리는 클라이언트의 큐를 나타낸다. 서버는 대기열에서 연결을 하나씩 수락하고 처리할 수 있다.
  4. accept 메서드: ServerSocket 클래스는 accept 메서드를 제공하여 클라이언트의 연결 요청을 수락하고 클라이언트와 통신할 수 있는 Socket 객체를 반환한다. 서버 애플리케이션은 이 Socket을 사용하여 클라이언트와 데이터를 교환한다.
  5. 보안 및 설정: ServerSocket은 보안 및 소켓 설정을 구성하는 데 사용되는 메서드와 옵션을 제공한다.

2. 포트 번호 확인

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

public class Exam_01 {
    public static void main(String[] args) {
        ServerSocket ss = null;
        for (int i = 0; i < 65536; ++i ) {
        	try {
        		ss = new ServerSocket(i);
        		ss.close();
        	}catch(IOException e) {
        		System.out.println(i + "번은 현재 사용 중");
        	}
        }
    }
}

포트 번호는 65536 까지 있다. 0에서 65536 범위 내의 네트워크 포트의 가용성을 확인해 보자. 이 코드를 돌리면 이렇게 현재 사용 중인 포트 번호가 나온다.

3. 소켓 통신해 보기

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

public class Exam_01 {
    public static void main(String[] args) {
    	ServerSocket ss = null;
    	Socket soc = null;
    	
    	try {
    		ss = new ServerSocket(1239);
    		System.out.println("서버 대기 중....");
    		soc = ss.accept();
    		InputStreamReader isr = new InputStreamReader(soc.getInputStream());
    		// 입력 스트림을 얻는 메서드.
    		// 바이트 기반 스트림으로써, 클라이언트로부터 네트워크를 통해 전송된 데이터를 바이트 단위로 읽을 수 있도록 해 준다.
    		BufferedReader br = new BufferedReader(isr); 
    		// 문자 기반 입력 스트림을 버퍼링하는 역할 -> 데이터를 버퍼링을 통해 효율적으로 읽는 것이다.
    		
    		String msg = br.readLine();
    		System.out.println("클 정보 : " + soc.toString());
    		System.out.println("클에서 온 메세지 : " + msg);
    		
    		OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());
    		// 출력 스트림을 얻는 메서드이다. 서버에서 클라이언트로 데이터 단위로 보낼 수 있게 해 준다.
    		BufferedWriter bw = new BufferedWriter(osw);
    		// 문자 기반 입력 스트림을 버퍼링하는 역할 -> 데이터를 버퍼링을 통해 효율적으로 보내는 것이다.
    		PrintWriter pw = new PrintWriter(bw);
    		// 데이터 텍스트를 출력하는 데 사용되는 클래스이다.
    		pw.println(msg);
    		pw.close();
    		
    	}catch(IOException e) {
    		e.printStackTrace(); // 오류 메시지 출력해 주세요.
    	}
    	
    	
    }
}

먼저 실행

이러면 먼저 포트를 열어서 데이터가 들어올 때까지 기다린다. 이제 다음 코드로 가서 메시지를 보내 보자.

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

public class Exam_02 {
	public static void main(String[] args) {
		InetAddress ia = null;
		// IP 주소를 다루기 위한 클래스이다.
		Socket soc = null;
		String msg = "쉽고 재미있는 자바 네트워크 프로그램";
		try {
			ia = InetAddress.getByName("localhost");
			// 호스트 이름(도메인 이름)에 해당하는 IP 주소를 검색하는 데 사용
			soc = new Socket(ia, 1239);
			// 상대방의 아이피 주소와 상대방 포트 번호를 넣어 준다.
			// Socket 객체가 생성되며 서로 간에 연결이 잘 되었으면 통신을 주고받으며,
			// 이때 오류가 발생하면 통신을 시작할 수 없다. -> catch 로 연결
			
			OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());
			BufferedWriter bw = new BufferedWriter(osw);
			PrintWriter pw = new PrintWriter(bw);
			
			pw.println(msg);
			pw.flush();
			// PrintWriter 객체에서 버퍼에 있는 데이터를 출력 스트림으로 강제로 전송하는 메서드이다.
			// PrintWriter는 데이터를 출력할 때 내부적으로 버퍼를 사용하여 데이터를 모았다가 일정량이 쌓이면 자동으로 출력한다. 
			// 하지만 때때로 데이터를 즉시 출력해야 하는 경우가 있다. 
			// 이때 flush() 메서드를 호출하여 버퍼에 있는 데이터를 비워 바로 출력 스트림으로 전송합니다.
			// 데이터 손실 방지에도 도움이 된다.
			
			InputStreamReader isr = new InputStreamReader(soc.getInputStream());
			BufferedReader br = new BufferedReader(isr);
			String msg2 = br.readLine();
			System.out.println("서버에서 온 메시지 : " + msg2);
			soc.close();
			
		}catch(UnknownHostException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
		System.out.println("서버와의 접속 끝");
	}
}


서버에서 온 메시지를 확인할 수 있다.
사실 쉽고 재미있진 않다...
이해도 안 되지만 많이 사용해 보면 이해가 되지 않을까.

profile
자바 백엔드 개발자 개인 위키

0개의 댓글

관련 채용 정보