카테고리 없음

UniCast

GaeGim 2022. 9. 3. 22:29
반응형
  • UniCast

Uni(단일) + Cast(던지다) -> 단일 노드(연결된 장치)에 데이터를 보낸다.

송신 노드와 수신 노드 간 1:1 지속적인 통신 개념.

 

 

 

  • 원리

데이터를 보낼 곳에 Mac 주소를 프레임(데이터)에 포함시켜 보내는 방식이다.

Mac 주소를 찾아 통신을 하고, 요청을 받을 네트워크에 있는 노드들은 자신의 Mac 주소와 요청을 한 곳의 Mac 주소를 비교했을 때 동일하지 않으면 패킷이 LAN 카드에서 Mac 주소가 동일하지 않음을 구분하여 해당 프레임을 버리기 때문에 CPU 성능을 저하시키지 않는다.

따라서 출발지와 목적지가 확실해야 한다.

 

 

* LAN (Local Area Network} :네트워크 안에서 컴퓨터간의 통신을 할 때 사용하는 장비 중 하나로, 네트워크 어댑터나 NIC (Network Interface Card)라고도 하며, 자신에게 온 데이터를 CPU에 전달해 준다.

 

 

 

 

 

 

 

 

 

  • 서버 프로그램
package D2;

import java.net.ServerSocket; 
import java.net.Socket;

public class UniServer {
	public static void main(String[] args) {
		//서버 프로그램에만 사용하는 소켓.
		//하나의 TCP 포트를 열어서 이곳의 연결 요청을 받을 때 사용하는 클래스.
		//클라이언트에서 요청이 오길 기다렸다가 연결 요청이 오면 클라이언트와 연결을 맺고 다른 소켓을 만듦.
		ServerSocket ss = null;
		
        //TCP를 사용해 프로그램끼리 통신하려면 연결을 해야 한다.
		//연결을 위해선 연결 끝점이 필요하고 이가 소켓이다.
		//연결 끝점(End Point)이란 IP 주소와 Port 번호의 조합을 의미하며, 최종 목적지를 의미한다.
		Socket s = null;
        
		try {
			//서버 소켓 생성.
			ss = new ServerSocket(9000);
			
			System.out.println("Waiting for client..");
			
			//클라이언트 소켓 연결 수락, 수신받음.
			//연결을 받아 클라이언트 소켓을 생성해 반환한다.
			s = ss.accept();

			//Main 메서드가 끝날 때까지 동작을 멈추지 않는 스레드를 사용.
			Thread st = new SenderThread(s);
			Thread rt = new ReceiverThread(s);
			
			//스레드 실행.
			st.start();
			rt.start();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				//연결 소켓 닫음.
				ss.close();
			} catch (Exception e) {
			}
		}
	}
}

 

 

 

 

 

  • 클라이언트 프로그램
package D2;

import java.net.*;

public class UniClient{
    public static void main(String[] args) {
        Socket s = null;
        try{
        	//호스트 이름과 포트 번호를 입력해 소켓 생성.
            s = new Socket("127.0.0.1", 9000);
            
            System.out.println("Press \"exit\" to finish.");
            Thread st = new SenderThread(s);
            Thread rt = new ReceiverThread(s);
            
            st.start();
            rt.start();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

 

 

 

 

 

  • 요청 보내는 스레드
package D2;
 

import java.io.*; 
import java.net.Socket;

public class SenderThread extends Thread {
    Socket s;

    public SenderThread(Socket s) {
        this.s = s;
    }

    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter bw = new PrintWriter(s.getOutputStream());
            bw.flush();

            while (true) {
            	//버퍼에 저장된 문자열을 읽어 가져와 저장.
                String str = br.readLine();
                
                //읽어 가져온 문자열이 "exit"이면 스레드 종료.
                if (str.equals("exit"))
                	System.out.println("Exit the program..");
                    break;
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                s.close();
            } catch (Exception ignored) {

            }
        }
    }
}

 

 

 

 

 

  • 요청 받는 스레드
package D2;

import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class ReceiverThread extends Thread {
	
    Socket socket;
    
    public ReceiverThread(Socket socket) {
        this.socket = socket;
    }
    
    public void run() {
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            while (true) {
                String str = br.readLine();
                
                if(str == null)
                    break;
                
                System.out.println("Received message : " + str);
            }
        } catch (IOException e){
            System.out.println(e.getMessage());
        }
    }
}

 

1:1 대화를 하는 프로그램으로 보면 좋을 것 같다.

 

 

 

 

 

 

 

 

반응형