2020.11.09 고급자바 수업노트 Udp

 UdpServer 



package kr.or.ddit.udp;


import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.util.Scanner;

/*

UDP 방식 : 비연결 지향,, TCP 와 비교해서 신뢰성이 없다(유실된 데이터가 발생할 수 있다 ) . 

데이터가 순서대로 도착한다는 보장이 없다. 

  그렇지만 TCP 보다 속도가 빠르다. 패킷 하나보내고 받는쪽에서 잘 도착했다고 신호를 보내고, 다음패킷을

  보내고 등등 정상적 데이터가 왔는지 검사를 하기 때문에 속도가 느리다. 


  자른 데이터를 (패킷) 보낸다. 전체데이터가 아니라 

  종착지 : IP , 포트번호 , 패킷 순서, 

 

  DatagramSocket 객체와 DatagramPacket 객체를 이용해서 통신한다. 

  - DatagramSocket : 데이터의 송수신과 관련된 작업을 수행한다. (우체부) 

  - DatagreamPacket : 주고 받는 데이터와 관련된 작업을 수행한다. (소포)

  ==> 수신용 생성자와 송신용 생성자를 따로 제공해 준다. (객체를 생성할때 다르다 ) 

   

  TCP 의 경우에는 스트림을 이용해서 송수신하지만

  UDP 의 경우에는 데이터그램을 이용해서 송수신 한다. 

    

 

 

*/





public class UdpServer {


public static void main(String[] args) {


try {

// 통신할 포트번호를 지정하여 UDP 용 소켓을 생성한다.

DatagramSocket socket = new DatagramSocket(8888);


// 수신용 패킷변수와 송신용 패킷변수 선언

DatagramPacket inpacket, outpacket;

System.out.println("서버 실행중....");


while (true) {

// 데이터가 저장될 byte 형 배열 선언

byte[] bMsg = new byte[512];

// 수신용 패킷객체 생성

// => new DatagramPacket( 데이터가 저장될 byte 형 배열, 배열의 길이)

inpacket = new DatagramPacket(bMsg, bMsg.length);


// 데이터를 수신한다. ==> Socket 의 receive() 메서드를 이용한다.

// 수신된 데이터의 패킷저오는 지정된 패킷변수에 저장된다.

socket.receive(inpacket); // 데이터가 올 때까지 기다린다.


// 수신 받은 패킷에서 상대방의 주소, 포트번호 등을 알 수 있다.

InetAddress address = inpacket.getAddress();

int port = inpacket.getPort();


System.out.println("상대방의 ip 정보 : " + address);

System.out.println("상대방의 port 번호 : " + port);

System.out.println();


// 상대방이 보낸 메세지 출력하기

// 수신용 패킷.getData() ==> 실제 읽어온 데이터를 byte 형 배열로 반환한다.

// 수신용 패킷.getLength() ==> 실제 읽어온 데이터의 길이를 반환한다.

// 수신된 데이터는 수신용 패킷객체를 생성할 때 사용했던 byte 형 배열에도 저장된다.


// 수신된 문자열 메세지가 byte 형 배열로 오기 때문에 이 byte 배열을 다시

// 문자열로 변환해야 한다.

// 형식) new String(byte 형 배열, 0 , 실제읽어온 길이 )

// String msg = new String(bMsg , 0 , inpacket.getLength()); // 방법 

String msg = new String(inpacket.getData(), 0, inpacket.getLength()); // 방법2 ]


System.out.println("상대방이 보낸 메시지" + msg);


System.out.println();


// -------------------------------------------------------


// 상대방에게 메시지 보내기 ( 수신 받은 메시지 그대로 송신하는 예제 )


// 송신할 메시지를 byte 형 배열로 만든다.

byte[] sendMsg = msg.getBytes();


// 송신용 패킷 객체를 생성

// -> new DatagramPacket(전송할 데이터가 저장된 byte 형 배열,

// 전송할 데이터의 길이 (배열의 길이 ) , 상대방 주소 정보, 포트번호)


outpacket = new DatagramPacket(sendMsg, sendMsg.length, address, port);


// 송신하기 ==> Socket 의 send () 메서드를 이용한다.


socket.send(outpacket);

System.out.println("전송완료");


}


} catch (Exception e) {

// TODO: handle exception

}


}


}



UdpClient 



package kr.or.ddit.udp;


import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.util.Scanner;


public class UdpClient {


public static void main(String[] args) {

Scanner scan = new Scanner(System.in);


// 송신용 패킷변수와 수신용 패킷변수 선언


DatagramPacket outpacket, inpacket;


// 수신 받은 데이터가 저장될 byte 형 배열 변수 선언

byte[] bMsg = new byte[512];


try {

DatagramSocket socket = new DatagramSocket();


// 접속할 곳의 주소 객체 생성

// InetAddress address = InetAddress.getByName("localhost");

InetAddress address = InetAddress.getByName("127.0.0.1");


while (true) {

// 전송할 메시지 입력

System.out.println("보낼 메시지 입력 : ");

String msg = scan.nextLine();

if ("/end".equals(msg)) {

break;

}


// 전송할 패킷객체 생성

outpacket = new DatagramPacket(msg.getBytes(), msg.getBytes().length, address, 8888);


// 데이터 전송

socket.send(outpacket);


// ------------------------------

// 서버에서 온 데이터를 받아서 출력하기


// 수신용 패킷객체 생성

inpacket = new DatagramPacket(bMsg, bMsg.length);


// 수신


socket.receive(inpacket);


System.out.println("서버에서 온 응답 데이터 : " + new String(bMsg, 0, inpacket.getLength()));

System.out.println();


}


System.out.println("통신 끝...");

socket.close();


} catch (Exception e) {

// TODO: handle exception

}


}

}





댓글