UdpServer / UdpClient

조수경·2021년 11월 18일
0

고급자바

목록 보기
55/97

UdpServer

package kr.or.didt.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * UDP방식 : 비연결 지향, 신뢰성이 없다. 데이터가 순서대로 
 *         도착한다는 보장이 없다. 그렇지만 TCP보다는 속도가 빠르다.
 * 
 * DatagramSocket객체와 DatagramPacket객체를 이용해서 통신한다.
 * - DatagramSocket : 데이터의 송수신과 관련된 작업을 수행한다. (우체부 역할)
 * - DatagramPacket : 주고받는 데이터와 관련된 작업을 수행한다. (소포)
 *         ==> 수신을 위한 생성자와 송신을 위한 생성자가 따로 제공한다.
 *         
 *         
 */

public class UdpServer {

	public static void main(String[] args) {

		try {
			// 통신할 포트번호를 지정하여 소켓을 생성한다.
			DatagramSocket socket = new DatagramSocket(8888);
			
			// 수신용 패킷변수와 송신용 패킷변수 선언
			DatagramPacket inpacket, outpacket;
			
			System.out.println("서버 실행중...");
			
			while(true){
				// 데이터가 저장될 byte형 배열 선언
				byte[] bMsg = new byte[512];
				
				// 수신용 패킷객체 생성
				//    ==> 데이터가 저장될 byte형 배열, 배열의 길이를 이용하여 생성
				inpacket = new DatagramPacket(bMsg, bMsg.length);
				
				//데이터를 수신한다.
				//이 메서드는 데이터가 올 때까지 기다린다.
				//수신된 데이터의 패킷정보는 지정한 패킷변수에 저장된다.
				socket.receive(inpacket); //상대방이 보낸 패킷을 받은것
				
				//수신받은 패킷에서 상대방의 IP주소, 포트번호등을 알 수 있다.
				InetAddress address = inpacket.getAddress();
				int port = inpacket.getPort();
				
				System.out.println("상대방의 IP정보 : " + address);
				System.out.println("상대방의 Port정보 : " + port);
				
				// 상대방이 보낸 메시지 화면에 출력하기
				// inpacket.getLength() ==> 실제 읽어온 길이
				// inpacket.getData() ==> 실제 읽어온 데이터를 byte배열로 변환한다.
				// 실제 데이터는 수신용 패킷객체에 지정한 byte형 배열에도 저장된다.
				
				//방법1
				//String msg = new String(bMsg, 0, inpacket.getLength(), "utf-8"); 
				
				//방법2
				String msg = new String(inpacket.getData(), 0, inpacket.getLength(), "utf-8"); 
				if("/end".equals(msg)){
					break;
				}
				
				
				//0번부터 길이까지 문자열로 만들어라
				System.out.println("상대방이 보낸 메시지 : " + msg);
				System.out.println();
				
				//--------------------------------------------------------
				// 상대방에게 메시지 보내기(수신받은 메시지 그대로 송신한다.)
				
				// 송신할 메시지를 byte형 배열로 변환한다.
				byte[] sendMsg = msg.getBytes("utf-8");
				
				// 송신용 패킷 객체 생성
				//  ==> 전송할 데이터가 저장된 byte형 배열, 
				//      전송할 자료의 길이(배열의 길이), 상대방주소정보, 상대방포트번호
				//      위의 4가지를 생성한다.
				outpacket = new DatagramPacket(sendMsg, sendMsg.length, address, port);
				
				//송신하기 ==> send() 메서드 사용
				socket.send(outpacket);
				
				System.out.println("송신 완료...");
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		
	}

}

UdpClient

package kr.or.didt.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 inpacket, outpacket;
		
		//수신 받은 데이터가 저장될 byte형 배열
		byte[] bMsg = new byte[512];
		
		try {
			DatagramSocket socket = new DatagramSocket();
			
			//접속할 곳의 주소 생성한다.
			InetAddress address = InetAddress.getByName("localhost");
			
			while(true){
				//전송할 메시지 입력
				System.out.print("전송할 메시지 입력 : ");
				String msg = scan.nextLine();
				
				
				//전송할 패킷 객체 생성
				outpacket = new DatagramPacket(msg.getBytes("utf-8"),
						msg.getBytes("utf-8").length, address, 8888);
				
				//전송
				socket.send(outpacket);
				
				if("/end".equals(msg)){
					break;
				}
				//--------------------------------------------------------
				
				// 서버에서 보내온 메시지 받아서 출력하기
				
				// 수신용 패킷객체 생성
				inpacket = new DatagramPacket(bMsg, bMsg.length);
				
				//수신
				socket.receive(inpacket);
				
				System.out.println("서버의 응답 데이터 : " + new String(bMsg, 0, inpacket.getLength(), "utf-8"));
				
				System.out.println();
			
			}//while문 끝...
			
			System.out.println("통신 끝...");
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}
profile
신입 개발자 입니다!!!

0개의 댓글

관련 채용 정보