소켓 프로그래밍: TCP와 UDP(4)

2022. 5. 2. 17:25·자바/네트워킹

1. UDP 소켓 프로그래밍

- TCP 소켓 프로그래밍에서는 Socket과 ServerSocket을 사용하지만, UDP 소켓 프로그래밍에서는

DatagramSocket과 DatagramPacket을 사용한다.

 

- UDP는 비연결지향적인 프로토콜이라서 ServerSocket이 필요하지 않다.

 

- DatagramSocket은 UDP의 소켓이며, 데이터를 DatagramPacket에 담아서 전송한다.

 

- DatagramPacket은 헤더와 데이터로 구성되어 있으며, 보통 헤더는 수신할 호스트의 정보(호스트의 주소, 포트)가

저장되어 있다.

 

 

 

 

1-1. UDP 소켓 프로그래밍을 이해하기 위한 예제(1)

 

( 아래는 서버 프로그램이다. )

package Networking;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exercise015 {
	public static void main(String args[]) {
		try {
			new Exercise015().start(); // UDP서버를 실행시킨다.
		} catch (IOException e) {
			e.printStackTrace();
		}
	} // main
	
	public void start() throws IOException {
		// 포트 7777번을 사용하는 소켓을 생성한다.
		DatagramSocket socket = new DatagramSocket(7777);
		DatagramPacket inPacket, outPacket;

		byte[] inMsg = new byte[10];
		byte[] outMsg;

		while(true) {
			// 데이터를 수신하기 위한 패킷을 생성한다.
			inPacket = new DatagramPacket(inMsg, inMsg.length);

			// 패킷을 통해 데이터를 수신(receive)한다.
			socket.receive(inPacket);

			// 수신한 패킷으로 부터 client의 IP주소와 Port를 얻는다.
			InetAddress address = inPacket.getAddress();
			int port = inPacket.getPort();

			// 서버의 현재 시간을 시분초 형태([hh:mm:ss])로 반환한다.			
			SimpleDateFormat sdf = new SimpleDateFormat("[hh:mm:ss]");
			String time = sdf.format(new Date());
			outMsg = time.getBytes(); // time을 byte배열로 변환한다.

			// 패킷을 생성해서 client에게 전송(send)한다.
			outPacket = new DatagramPacket(outMsg, outMsg.length, address, port);
			socket.send(outPacket);
		}
	} // start()
}

 

( 아래는 클라이언트 프로그램이다. )

package Networking;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Exercise016 {
	public void start() throws IOException, UnknownHostException {
		DatagramSocket datagramSocket = new DatagramSocket();
		InetAddress    serverAddress  = InetAddress.getByName("127.0.0.1");

		// 데이터가 저장될 공간으로 byte배열을 생성한다.
		byte[] msg = new byte[100];

		DatagramPacket outPacket = new DatagramPacket(msg, 1, serverAddress, 7777);
		DatagramPacket inPacket  = new DatagramPacket(msg, msg.length);

		datagramSocket.send(outPacket);   // DatagramPacket을 전송한다.
		datagramSocket.receive(inPacket); // DatagramPacket을 수신한다.

		System.out.println("current server time :" + new String(inPacket.getData()));

		datagramSocket.close();
	} // start()

	public static void main(String args[]) {
		try {
			new Exercise016().start();
		} catch(Exception e) {
			e.printStackTrace();
		}
	} // main 
}

 

( 먼저 서버에서 DatagramSocket을 이용하여 클라이언트의 응답을 기다리기 위해 receive()를 써서 기다린다. )

( 그런 다음, 클라이언트의 응답이 오면 답장하기 위해 클라이언트의 주소와 포트 번호를 가져온다. )

 

( 클라이언트는 서버에게 자신의 주소와 포트를 알리기 위해 간단한 1개의 메시지를 전달한다. )

( 그런 다음, 다시 서버에게 receive()를 통해 받은 내용을 getData()를 통해 받는다. )

저작자표시 (새창열림)

'자바 > 네트워킹' 카테고리의 다른 글

소켓 프로그래밍: TCP와 UDP(3)  (0) 2022.05.02
소켓 프로그래밍: TCP와 UDP(2)  (0) 2022.05.02
소켓 프로그래밍: TCP와 UDP(1)  (0) 2022.05.01
네트워킹(Networking) (2) - URL, URLConnection  (0) 2022.04.30
네트워킹(Networking) (1) - InetAddress  (0) 2022.04.30
'자바/네트워킹' 카테고리의 다른 글
  • 소켓 프로그래밍: TCP와 UDP(3)
  • 소켓 프로그래밍: TCP와 UDP(2)
  • 소켓 프로그래밍: TCP와 UDP(1)
  • 네트워킹(Networking) (2) - URL, URLConnection
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      제자리 정렬
      안정 정렬
      outputstream
      중간연산
      snail
      람다식
      map()
      문자 기반 스트림
      ServerSocket
      역직렬화
      코딩트리조별과제
      코드트리
      Collections Framework
      java.time 패키지
      스트림
      안드로이드 스튜디오
      다형성
      InputStream
      TCP 소켓 프로그래밍
      serializable
      코딩테스트
      알고스팟
      Arrays
      유용한 클래스
      자바 개념
      file
      java.lang패키지
      불안정 정렬
      소켓 프로그래밍
      선택 정렬
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    소켓 프로그래밍: TCP와 UDP(4)
    상단으로

    티스토리툴바