본문 바로가기

자바의 정석 정리

자바의 정석 - 16.7 UDP 소켓 프로그래밍

16.7.1 UDP 소켓 프로그래밍

  • DatagramSocket을 사용하여 데이터를 DatagramPacket에 담아 전송
  • DatagramPacket는 헤더와 데이터로 구성. 헤더에는 IP 및 Port 저장

16.7.2 Server와 Client 연결 예제

  • Server
public class UdpServer 
{
    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()

    public static void main(String args[]) 
     {
        try {
            new UdpServer().start(); // UDP서버를 실행시킨다.
        } catch (IOException e) {
            e.printStackTrace();
        }
    } // main
}

-Client

public class UdpClient {
    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 UdpClient().start();
        } catch(Exception e) {
            e.printStackTrace();
        }
    } // main 
}