Backend/JAVA

JAVA 소켓프로그래밍 Network UDP

쏠솔랄라 2023. 3. 3. 13:09

 

 

소켓프로그래밍 Network UDP

 

소켓프로그래밍 : 채팅

통신방식
   UDP : 비연결형 ; 무전기, 개인 쪽지, 문자메세지
   TCP : 연결형 ; 핸드폰, 1:1채팅
        * TCP : Socket, ServerSocket
        상대방과 1:1로 연결이 유지되는 객체

 

 

// Sender class

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetSocketAddress;

import java.net.SocketAddress;

import java.net.SocketException;

public class UDPSender {

 

public static void main(String[] args) {

 

try(DatagramSocket ds = new DatagramSocket();) {

System.out.println(ds.getLocalPort());

 

String data = "장땡땡";

byte[] b = data.getBytes();

 

//send용 패킷

SocketAddress address = new InetSocketAddress("000.000.00.000", 23232);

//아이피 주소와 포트번호를 관리하는 객체

 

DatagramPacket packet = new DatagramPacket(b,b.length,address);

 

//데이터 전송

ds.send(packet);

 

System.out.println("패킷 전송!");

 

//데이터 받기

b = new byte[1024];

 

packet.setData(b);

ds.receive(packet);

 

b = packet.getData();

//전송 받은 데이터를 byte형태로 반환해주는 메소드

 

System.out.println(new String(b));

System.out.println(b.length);

System.out.println(packet.getLength());

 

}catch(SocketException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

출력화면 

 

 ** CMD에서 IP주소 확인하기

cmd > 관리자 명령 프로토콜

 

ipconfig로 내 ip주소 확인

 

 

// Receiver class

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.SocketException;

public class UDPReceiver {

 

public static void main(String[] args) {

 

/*

UDP 방식

DatagramSocket : 메신저 역할

DatagramPacket : 문자 역할

*/

 

DatagramSocket socket = null;

 

try {

socket = new DatagramSocket(23232);

// 디폴트 생성자로 생성 시에는 포트번호를 알아서 생성한다

// 이미 사용중이거나 없는 포트번호면 SocketException이 발생

// TCP와 UDP일 경우는 겹쳐도 된다

 

System.out.println(socket.getLocalPort());

 

} catch (SocketException e) {

e.printStackTrace();

}

 

try {

while(true) {

 

// 받는 작업

byte[] b = new byte[1024];

DatagramPacket packet = new DatagramPacket(b,b.length);

 

socket.receive(packet);

// 대기상태에 있다가 실제 전달받으면 다음으로 넘어간다

 

System.out.println(packet.getSocketAddress());

System.out.println(new String(b));

 

//전송

b = "수신 성공".getBytes();

 

packet.setData(b);

socket.send(packet);

 

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

출력화면

 

 콘솔창에서 receiver 출력

 

출력화면

  

 


 

 

CMD에서 UDP 송수신 확인하기

 

cmd > 관리자 명령 프로토콜

 

c: 

cd [bin값 입력]

 

sender: 

java sender.UDPSender

 

receiver:

java receiver.UDPReceiver

 

** version 관련 Error 발생

해당 오류는 현재 사용하고 있는 JAVA의 SE버전이 높아서 그런 것으로

SE11로 낮추어 준다

 

JRE에서 마우스 우클릭 > Build Path > Configure Build Path

 

JRE System Library 더블클릭해서 라이브러리 실행

 

 

JAVA SE11버전으로 낮추어 설정