자바의 정석 정리
자바의 정석 - 16.7 UDP 소켓 프로그래밍
ksb-dev
2022. 8. 31. 18:02
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
}