본문 바로가기
프로그래밍/java

자바 네트워크 프로그래밍 UDP 소켓

by -현's- 2014. 2. 9.
반응형


●UDP 소켓

- TCP 소켓은 서로 연결된 상태에서의 통신 방법이다. 이 방법은 높은 신뢰성이 요구된느 응용 프로그램에 적합하지만 높은 신뢰성이 요구되지 않거나 적은 양의 데이터를 전송할 때는 네트워크에 부담을 많이 주기 때문에 적합하지 않다. 그래서 이때는 UDP소켓을 쓰는 것이 좋다.


- UDP는 TCP소켓에 비해 신뢰성과 안정성은 부족하지만 연결을 설정하지 않으므로 네트워크에 부담을 주지 않는다.


- 자바에서는 DatagramPacket, DatagramSocket 클래스를 사용한다.


DatagramPacket 클래스는 데이터그램을 사용할 수 있게 한다.


- 데이터그램 패켓은 비연결 패킷 전송 서비스를 구현하기 위해 사용한다.


DatagramSocket 클래스는 데이터그램 패킷을 보내거나 받기 위한 데이터그램 소켓 기능을 제공해준다.








●ex

- UDPServer.java


import java.net.*;

import java.io.*;


public class UDPServer

{

public final static int discardPort = 3000;

static byte[] buffer = new byte[65507];


public static void main(String[] args){

int port;

try{

port=Integer.parseInt(args[0]);

}catch(Exception e){

port=discardPort;

}


try{

DatagramSocket ds = new DatagramSocket(port);

DatagramPacket dp = new DatagramPacket(buffer, buffer.length);

while(true){

try{

ds.receive(dp);

String s = new String(dp.getData(), 0, 0, dp.getLength());

System.out.println(dp.getAddress()+" at port"+dp.getPort()+" says"+s);

}catch(IOException e){

System.err.println(e);

}

}

}catch(SocketException se){

System.out.println("22");

System.err.println(se);

}

}

}





- UDPClient.java


import java.net.*;

import java.io.*;


public class UDPClient

{

public final static int port = 3000;

public static void main(String[] args){

String hostname;

if(args.length>0){

hostname=args[0];

}else{

hostname="localhost";

}


try{

String strInput;

DatagramPacket outPacket;


InetAddress server = InetAddress.getByName(hostname);


BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));


DatagramSocket dSock = new DatagramSocket();


while(true){

strInput = userInput.readLine();


if(strInput.equals("quit"))break;


byte[] data = strInput.getBytes();


outPacket = new DatagramPacket(data, data.length, server, port);


UDPClient.viewInfo(outPacket);


dSock.send(outPacket);

}


}catch(UnknownHostException e){

System.err.println(e);

}catch(SocketException se){

System.err.println(se);

}catch(IOException e){

System.err.println(e);

}

}


public static void viewInfo(DatagramPacket packet){

System.out.println("패킷의 대상 주소:"+packet.getAddress().toString());

System.out.println("패킷의 대상 포트:"+packet.getPort());

System.out.println("패킷의 데이터 크기:"+packet.getLength());

}

}


 



























반응형

댓글