참고
- 이것이 자바다 p.1087~1091
- 교재 p.63~65
UDP: User Datagram Protocol
- 비연결지향적
- 데이터의 신뢰성을 보장 하지 않는다
- TCP에 비해 전송 속도가 빠르다
UDP Datagram 구조
- IP 헤더 (60bytes)
- 패킷의 발신지, 목적지 주소, 길이, 체크섬, TTL, 다른 IP 옵션들
- UDP 헤더 (8bytes)
- 발신지 포트, 목적지 포트, 헤더 포함 길이, 체크섬
- UDP 페이로드 (65508bytes, 보통 512bytes로 제한)
UDP 통신 관련 클래스
DatagramPacket 클래스
- 클라이언트에게 보낼 데이터를 패킷에 포장하는 역할
- UDP 데이터그램을 추상화한 클래스
- 애플리케이션에서 주고 받을 데이터와 관련된 클래스
- 데이터 송신기능과 수신 기능으로 분리
- 출발지 주소, 목적지 주소를 설정하거나 주소를 얻어오는 메소드
- 출잘지 포트, 목적지 포트를 설정하거나 포트를 얻어노는 메소드
주요메서드
- getAddress(), getData(), getLength(), getOffset(), getPort()
- setAddress(InetAddress iaddr), setData(byte[ ] butf), setData(byte[ ] buf, int offset, int length), setLength(int length), setPort(int port)
DatagramSocket 클래스
- 데이터를 보내고 받을 때 사용하는 클래스
- 패킷에 담긴 데이터를 클라이언트에게 보내는 역할
- TCP 스트림 소켓과 달리 서버와 클라이언트 데이터그램 소켓 사이에는 차이가 없으며 모든 데이터그램 소켓은 데이터그램을 전송할 뿐만 아니라 수신에 사용할 수 있다
- 모든 DatagramSocket 객체는 데이터그램을 수신하기 위해서 사용될 수 있기때문에 로컬 호스트 내의 유일한 UDP포트와 연관되어 있다.
주요메서드
- send(dp), receive(dp), close()
- getLocalPort()
- connect(InetAddress address, int port), disconnect()
- getPort()
- getInetAddress()
예제1
UdpServer.java
- 상대방이 UDP방식으로 데이터 보낸 것을 받으려면 무조건 패킷에 담아야하고 그걸 socket의 receive 메서드 이용
- 소켓을 만들어서 받을 준비하고 있어야 받을 수 있다
- 준비된 소켓이 없으면 날라온 패킷 파스스..증발..
public class UdpServer {
private DatagramSocket socket;
public void start() throws IOeException {
socket = new DatagramSocket(8888);
DatagramPacket inPacket, outPacket;
byte[] inMsg = new byte[1];
byte[] outMsg;
while (true) {
inPacket = new DatagramPacket(inMsg, inMsg.length);
System.out.println("패킷 수신 대기중...");
socket.receive(inPacket);
System.out.println("패킷 수신 완료.");
InetAddress address = inPacket.getAddress();
int port = inPacket.getPort();
SimpleDateFormat sdf = new SimpleDateFormat("[hh:mm:ss]");
String time = sdf.format(new Date());
outMsg = time.getBytes();
outPacket = new DatagramPacket(outMsg, outMsg.length, address, port);
socket.send(outPacket);
}
}
public static void main(String[] args) throws IOException {
new UdpServer().start();
}
} UdpServer class
UdpClient.java
public class UdpClient {
public void start() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
byte[] msg = new byte[100];
DatagramPacket outPacket = new DatagramPacket(msg, 1, serverAddress, 8888);
DatagramPacket inPakcet = new DatagramPacket(msg, msg.length);
datagramSocket.send(outPacket);
datagramSocket.receive(inPacket);
System.out.println("현재 서버시간 => " + new String(inPacket.getData()));
datagramSocket.close();
}
public static void main(String[] args) throws IOException {
new UdpClient().start();
}
}
실행
Server먼저 실행
Client먼저 실행
- 패킷 날아가버림
예제2
UdpFileReceiver.java
UdpFileSender.java