본문 바로가기

JAVA/네트워크 프로그래밍

[JAVA] 서버 소켓 ② Binary Data 보내기

텍스트 대신 바이너리 데이터를 보내는 방법은 Writer를 사용하여 문자열을 전송하는 것 대신에 OutputStream을 사용하여 바이트 배열을 전송하면 된다.


아래의 예제는 RFC 868에 기술된 타임 프로토콜을 따르는 반복 시간 서버이다.


클라이언트가 연결되면, 서버는 1900년 1월 1일 자정 이후의 시간을 초로 표현한 4바이트, 빅엔디안, 부호 없는 정수 값을 보낸다. 또다시, 현재 시간은 Date 객체를 생성하여 구한다. 그러나 자바의 Date 클래스는 1970년 1월 1일 자정 이후의 시간을 밀리초 단위로 세기 때문에 변환이 필요하다.


package network;


import java.io.*;

import java.net.*;

import java.util.Date;


public class T52TimeServer {

public final static int PORT = 37;

public static void main(String[] args) {

// 타임 프로토콜은 1900년을 기준으로 하지만,

// 자바 Date 클래스는 1970년을 기준으로 한다.

// 아래 숫자는 시간을 변환하는 데 사용된다.

long differenceBetweenEpochs = 2208988800L;

try(ServerSocket server = new ServerSocket(PORT )){

while(true){

try(Socket connection = server.accept()){

OutputStream out = connection.getOutputStream();

Date now = new Date();

long msSince1970 = now.getTime();

long secondsSince1970 = msSince1970/1000;

long secondsSince1900 = secondsSince1970 + differenceBetweenEpochs;

byte[] time = new byte[4];

time[0] = (byte) ((secondsSince1900 & 0x0000000FF000000L)>> 24);

time[1] = (byte) ((secondsSince1900 & 0x000000000FF0000L)>> 16);

time[2] = (byte) ((secondsSince1900 & 0x00000000000FF00L)>> 8);

time[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL));

out.write(time);

out.flush();

}catch(IOException e){

System.err.println(e.getMessage());

}

}

}catch(IOException e){

System.err.println(e);

}

}

}