TIL 07 - JAVA

eyan31·2022년 6월 21일
0

TIL

목록 보기
7/25
post-thumbnail

TIL | 06.21의 기록

ServerSocket

클라이언트가 연결 요청을 해오면, 연결을 기다리면서 연결 수락을 담당하는 것이 ServerSocket이고, 클라이언트와의 통신을 담당하는 것이 Socket이다. 클라이언트가 연결 요청을 해오면 ServerSocekt은 연결을 수락하고 통신용 Socket을 만든다. ServerSocket은 port번호를 지정하여 객체를 생성한다.

ss = new ServerSocket(10000);
Socket s = ss.accept(); //클라이언트 접속을 accept()메소드가 기다리고
						//접속을 하면 클라이언트 정보가 있는 Socket객체를 리턴해준다
InetAddress ia = s.getInetAddress(); //ip구하기
System.out.println(ia.getHostAddress()+"->클라이언트가 접속하였습니다.");

//서버에서 클라이언트에게 문자(코드)보내기
OutputStream os = s.getOutputStream(); //1byte
OutputStreamWriter osw = new OutputStreamWriter(os); //1 char
PrintWriter pw = new PrintWriter(osw); //한줄씩
				
pw.println("서버->클라이언트에게->서버에 접속되었습니다.");
pw.flush(); //데이터 넘어감

//클라이언트가 보낸 문자 받기
InputStream is = s.getInputStream(); //byte
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
				
String txt = br.readLine();
System.out.println("server가 받은 문자 -->"+ txt);

Socket

서버가 실행되면 클라이언트는 서버의 IP주소와 Port번호로 Socket을 생성해서 연결 요청을 할 수 있다.

Socket s;
InetAddress ia = InetAddress.getByName("172.30.1.27");
s = new Socket(ia, 10000); // 객체를 생성하는 순간 서버에 접속됨
//서버에서 보낸 문자 받기
InputStream is = s.getInputStream(); //1byte
InputStreamReader isr = new InputStreamReader(is); //한문자
BufferedReader br =  new BufferedReader(isr); //한줄씩
			
String str = br.readLine(); 
System.out.println("받은 문자 : "+str);

//클라이언트가 서버에게 문자 보내기
OutputStream os = s.getOutputStream(); // byte
OutputStreamWriter osw = new OutputStreamWriter(os); //문자
PrintWriter pw = new PrintWriter(osw);
			
pw.println("client--> server : 클라이언트가 서버로 문자 보냄...");
pw.flush();

UDP

UDP는 비연결 지향적 프로토콜이다. 비연결 지향적이란 데이터를 주고받을 때 연결 절차를 거치지 않고, 발신자가 일방적으로 데이터를 발신하는 방식이다. 이를 위해 DatagramSocketDatagramPacket이 사용된다.
DatagramSocket은 정보를 주고 받는 발신점과 수신점에 해당하는 클래스이고, DatagramPacket은 주고받는 데이터와 수신자 정보를 담고 있는 패킷 클래스이다.

Unicast (1 : 1)

  1. 데이터 주고 받기
//Send

public class UnicastSend {
	DatagramSocket ds;
	DatagramPacket dp;
	InetAddress ia; //ip : 172.30.1.27
	public UnicastSend() {
		String str = "Spring Framework, 스프링 프레임워크";

		//정보 보내는 곳
		ds = new DatagramSocket();
		//UDP방식의 정보를 보낼 경우 DatagramPacket을 생성하여 전송한다.
		byte[] data = str.getBytes();
		ia = InetAddress.getByName("172.30.1.27");
		//					  보낼데이터	보낼범위		   받는컴
		dp = new DatagramPacket(data, 0, data.length, ia, 12000);
		//전송하기
		ds.send(dp);
			
		System.out.println("전송완료--- 보내기");\
    }
//Receive

public class UnicastReceive {
	DatagramSocket ds;
	DatagramPacket dp;
	public UnicastReceive() {
		
		//정보 받는 곳
		ds = new DatagramSocket(12000); //받는 쪽은 port를 열어줘야한다
		//전송 권장 크기 : 512byte
		byte[] data = new byte[512];
		dp = new DatagramPacket(data, data.length);
		ds.receive(dp);
			
		//전송받은 데이터 출력하기
		byte[] receiveData = dp.getData();			  //전송받은 바이트수
		System.out.println(new String(receiveData, 0, dp.getLength()));
    }
  1. 파일 주고 받기
//Send

public class FileUnicastSend {
	DatagramSocket ds;
	DatagramPacket dp;
	InetAddress ia;
	final int PORT = 15000; //Port번호는 final로 고정시켜놓고 쓰는게 편하다
	public FileUnicastSend() {
		ds = new DatagramSocket();
		ia = InetAddress.getByName("172.30.1.27");
			
		//파일의 내용을 byte배열로 읽어와 전송하기 위해 InputStream객체를 생성한다.
		File f = new File("c://img/01.jfif");
		FileInputStream fis = new FileInputStream(f);
			
		//파일명을 전송		     컨텐츠안에서 나올수없는 문자 붙여주는게 좋다
		String sendFileName = "[*$@File&]" + f.getName(); 
		dp = new DatagramPacket(sendFileName.getBytes(), 0, sendFileName.getBytes().length, ia, PORT);
		ds.send(dp);
			
		//파일내용을 읽어 전송
		while(true) {
			byte[] b = new byte[512];
			int byteCount = fis.read(b, 0, b.length);
			if(byteCount<=0) break;		//읽어온 바이트수
			dp = new DatagramPacket(b, 0, byteCount, ia, PORT);
			ds.send(dp);
			}
			
		//전송완료..
		String endMessage = "[@@#%%^$*]";
		dp = new DatagramPacket(endMessage.getBytes(), 0, endMessage.getBytes().length, ia, PORT);
		ds.send(dp);
	}
//Receive

public class FileUnicastReceive {
	DatagramSocket ds;
	DatagramPacket dp;
	FileOutputStream fos;
	public FileUnicastReceive() {
		
        ds = new DatagramSocket(15000);
		byte[] receiveData = new byte[512];
		dp = new DatagramPacket(receiveData, receiveData.length);
			
		while(true) {
			ds.receive(dp); //전송받기
				
			byte[] receive = dp.getData(); //받은 데이터 
			int byteCount = dp.getLength(); //전송받은 byte수
				
			String receiveStr = new String(receive, 0, byteCount); //[*$@File&]01.jfif
			if(byteCount>=10 && receiveStr.substring(0, 10).equals("[*$@File&]")) {//파일명이 전송되었다.
				fos = new FileOutputStream(new File("c://testFolder", receiveStr.substring(10))); //c://testFolder/01.jfif
				System.out.println("파일생성됨...---->"+receiveStr); //전송된 값 확인하려고 ..
			}else if(byteCount>=10 && receiveStr.equals("[@@#%%^$*]")){
				fos.close();
				ds.close();
				System.out.println("파일로 저장되었습니다.....");
				break;
			}else {//파일내용
				fos.write(receive, 0, byteCount);
			}
	}

Multicast (1 : 다)

  1. 데이터 주고 받기
//Send

public class MulticastSend {
	//공용 ip : 224.0.0.0 ~ 239.255.255.255
    
	MulticastSocket ms;
	DatagramPacket dp;
	InetAddress ia;
	final int PORT = 20000;
	public MulticastSend() {
		//보낼 내용
		Strig str = "멀티캐스트를 이용한 통신 연습중...";
		
		ms = new MulticastSocket();
		ia = InetAddress.getByName("231.100.200.1");
		dp = new DatagramPacket(str.getBytes(), 0, str.getBytes().length, ia, PORT);
			
		ms.send(dp); //공용 ip로 전송
		System.out.println("전송완료...send");
  }
//Receive

public class MulticastReceive {
	MulticastSocket ms;
	DatagramPacket dp;
	InetAddress ia;
	final int PORT = 20000;
	public MulticastReceive() {
		
		ms = new MulticastSocket(PORT);
		ia = InetAddress.getByName("231.100.200.1");
			
		InetSocketAddress isa = new InetSocketAddress(ia, PORT);
		NetworkInterface ni = NetworkInterface.getByName("hfg"); //마음대로 이름짓기
		ms.joinGroup(isa, ni);
			
		byte[] data = new byte[512];
		dp = new DatagramPacket(data, data.length);
		ms.receive(dp); //받기 대기중
			
		System.out.println(new String(dp.getData(), 0, dp.getLength()));
}
  1. 파일 주고 받기
    Unicast와 유사하다.
profile
터벅터벅 개발자 지망생의 하루

0개의 댓글