UDP 방식으로 데이터를 전송하기(JAVA - DatagramSocket, DatagramPacket 활용)

안녕하세요

이번 시간에는 TCP 방식이 아닌 UDP 방식으로 데이터를 전송하는

예제를 올려봅니다.

UDP 방식은 비록 비연결지향, 비신뢰적, 데이터가 순서대로 도착한다는 보장을 못한다는

단점이 있지만 TCP 방식보다 빠르게 데이터를 전달할수 있는 장점이 있습니다.

실시간 동영상 서비스는 UDP 방식으로 구현이 되죠


자 어쨋든 예제 바로 올려봅니다.


아래에 있는 소스는 UDP 데이터를 보내는 Sender 파일입니다.

=========================================================

import java.net.*;

import javax.swing.JOptionPane;

import java.io.*;
/* 데이터를 보내는 측
 * UDP방식 : 비연결 지향, 비신뢰적, 데이터가 순서대로 도착한다는 보장을 못함
 * 하지만 TCP방식보다 빠르게 전달된다.
 * DatagramPacket, DatagramSocket을 사용
 * - DatagramSocket : 데이터 송수신과 관련된 클래스(우체부)
 * - DatagramPacket : 주고 받을 데이터와 관련된 클래스(소포) / 수신을 위한 생성자와 송신을 위한 생성자 두 가지를 제공
 * TCP의 경우 스트림을 이용해 데이터를 주고 받지만 UDP의 경우 데이터그램을 이용해 데이터를 송수신한다
 *
 * */
public class UDPSender {

public static void main(String[] args) throws Exception {

String ip=JOptionPane.showInputDialog("IP주소를 입력하세요");
if(ip==null||ip.trim().isEmpty()){
ip="localhost";
}
InetAddress inet=InetAddress.getByName(ip);

//키보드 입력
BufferedReader key=new BufferedReader(new InputStreamReader(System.in));
System.out.println("보낼 내용을 입력하세요");
DatagramSocket ds=new DatagramSocket();

String sendMsg="";
while((sendMsg=key.readLine())!=null){
if(sendMsg.equalsIgnoreCase("x")) break; //종료
//문자열을 byte 배열에 담자
byte[] data=sendMsg.getBytes();
DatagramPacket pack=new DatagramPacket(data,data.length,inet,3000);
// 데이터, 보낼 데이터 길이, 받을 사람의 ip, 포트번호
ds.send(pack);
System.out.println("보낼 내용을 입력하세요");
}//while-----------------

if(ds!=null) ds.close();
}

}

=========================================================

위에서 udp 데이터를 전송했으면 당연히 받는 receiver가 필요합니다


=========================================================

import java.net.*;
import javax.swing.JOptionPane;
import java.io.*;

public class UDPReceiver {

public static void main(String[] args) throws Exception{

//데이터를 받기 위해 byte배열을 생성한다.
//UDP의 실제 데이터는 512바이트로 제한하는 경우가 많다.
byte[] buffer=new byte[100];

DatagramSocket ds=new DatagramSocket(3000);
DatagramPacket pack=new DatagramPacket(buffer,buffer.length);

while(true){
ds.receive(pack);
byte[] bmsg=pack.getData();
String msg=new String(bmsg,0,pack.getLength());
System.out.println(pack.getAddress()+"로 부터 ["+pack.getPort()+"]번 포트에서 온 메시지: "+msg);
}
}
}

=========================================================


위의 소스를 실행하기 위해서는 도스창에서 실행시키는게 좋습니다.

화면은 아래와 같습니다


UDPSender를 실행시키면 ip주소를 입력하라는 메시지가 나옵니다

저는 그냥 'localhost' 라고 입력하겠습니다.

 

그리고 보낼 내용을 입력하라는 메시지가 나옵니다

저는 '안녕하세요', '반갑습니다' 라고 보내겠습니다



UDPReceiver를 보면 제가 보낸 메시지가 정상적으로 출력이 됩니다

어때요 참 쉽죠? ㅎ



댓글 없음:

댓글 쓰기