[Java Tips] DatagramSocket을 이용한 간단한 UDP 서버/클라이언트 구현
Posted at 2009/10/22 12:08 // in Java Tips // by FrogInPot
이번 팁에서는 DatagramSocket과 DatagramPacket을 이용하여 간단한 UDP 서버/클라이턴트를 구현해 보겠습니다.
UDP 통신을 위해서는 UDP 패킷을 받을 서버 Socket이 생성되어야 합니다.
Socket 생성 시는 다음과 같은 순서로 수행합니다.
1. DatagramSocket 생성 : 생성 시, Listen할 Port 지정
2. DatagramPacket 생성 : 데이터를 수신할 그릇이 되는 DatagramPacket 생성
3. DatagramSocket.receive() 호출 : 생성된 Socket의 receive method를 생성된 packet object를 파라미터로 하여 호출. receive method는 호출 후, packet이 수신될 때까지 대기를 하게 됨
간단하게 구현한 UDP 서버는 다음과 같습니다.
01.
import
java.io.IOException;
02.
import
java.net.DatagramPacket;
03.
import
java.net.DatagramSocket;
04.
import
java.net.SocketException;
05.
06.
public
class
DatagramServer
extends
Thread {
07.
08.
private
DatagramSocket socket;
09.
10.
public
DatagramServer()
throws
SocketException {
11.
super
();
12.
13.
// DatagramPacket을 받기 위한 Socket 생성
14.
// 9999 : Listen할 Port
15.
socket =
new
DatagramSocket(
9999
);
16.
}
17.
18.
public
void
run() {
19.
while
(
true
)
20.
{
21.
try
22.
{
23.
// 데이터를 받을 버퍼
24.
byte
[] inbuf =
new
byte
[
256
];
25.
26.
// 데이터를 받을 Packet 생성
27.
DatagramPacket packet =
new
DatagramPacket(inbuf, inbuf.length);
28.
29.
// 데이터 수신
30.
// 데이터가 수신될 때까지 대기됨
31.
socket.receive(packet);
32.
33.
// 수신된 데이터 출력
34.
System.out.println(
"received length : "
+ packet.getLength() +
", received data : "
35.
+
new
String(packet.getData(),
0
, packet.getLength()));
36.
}
catch
(IOException e)
37.
{
38.
e.printStackTrace();
39.
}
40.
}
41.
}
42.
43.
public
static
void
main(String args[])
throws
SocketException{
44.
DatagramServer server =
new
DatagramServer();
45.
server.start();
46.
}
47.
}
클라이언트는 마찬가지로, DatagramSocket과 DatagramPacket을 이용하여 데이터를 전송하며 순서는 다음과 같습니다.
1. DatagramSocket 생성 ; 생성 시, Packet을 전송할 Server IP, PORT 정보 전달
2. DatagramPacket 생성 및 데이터 입력 : 전송할 Packet을 생성하고, 데이터를 입력
3. DatagramSocket.send 호출 : 전송할 Packet을 send method로 전송
간단한 클라이언트 소스는 다음과 같습니다.
01.
import
java.io.IOException;
02.
import
java.net.DatagramPacket;
03.
import
java.net.DatagramSocket;
04.
import
java.net.InetAddress;
05.
import
java.net.SocketException;
06.
import
java.net.UnknownHostException;
07.
08.
public
class
DatagramClient
extends
Thread {
09.
10.
public
DatagramClient() {
11.
super
();
12.
}
13.
14.
public
void
run() {
15.
try
16.
{
17.
while
(
true
)
18.
{
19.
// 전송할 데이터 : 현재 시간
20.
String data = String.valueOf(System.currentTimeMillis());
21.
22.
// 전송할 DatagramPacket 생성
23.
DatagramPacket packet =
new
DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress
24.
.getByName(
"127.0.0.1"
),
9999
);
25.
26.
// DatagramSocket 생성
27.
DatagramSocket socket =
new
DatagramSocket();
28.
29.
// DatagramPacket 전송
30.
socket.send(packet);
31.
}
32.
}
catch
(UnknownHostException e)
33.
{
34.
e.printStackTrace();
35.
}
catch
(SocketException e)
36.
{
37.
e.printStackTrace();
38.
}
catch
(IOException e)
39.
{
40.
e.printStackTrace();
41.
}
42.
}
43.
44.
public
static
void
main(String args[]) {
45.
DatagramClient client =
new
DatagramClient();
46.
client.start();
47.
}
48.
}
Output :
received length : 13, received data : 1256179996593
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996640
received length : 13, received data : 1256179996640
received length : 13, received data : 1256179996640
received length : 13, received data : 1256179996640
'Java Tips' 카테고리의 다른 글
[Java Tips] LineNumberReader를 이용해 손쉽게 Line Number 추출하기 (0) | 2009/12/29 |
---|---|
[Java Tips] Logger 설정을 Properties File로 처리하는 법 (0) | 2009/12/29 |
[Java Tips] DatagramSocket을 이용한 간단한 UDP 서버/클라이언트 구현 (0) | 2009/10/22 |
[Java Tips] Localhost의 IP, Hostname을 알아내는 법 (0) | 2009/10/22 |
[Java Tips] 도메인(Domain)을 IP로 변환하는 법 (0) | 2009/10/22 |
[Java Tips] 날짜 비교하는 법 (0) | 2009/10/21 |