34.단방향 통신

Jan 10, 2024
34.단방향 통신
소켓 통신 예시 사진

서버와 클라이언트

💡
서버: 요청 받는 자 갑의 위치에 있다. 클라이언트: 요청하는자이며 을의 위치에 있다.

포트

💡
프로세스를 결정하는 것 으로 논리적인 번호를 부여한다(프로그램에 주소 같은 개념이다.) 소켓에 포트가 부여되며 부여된 포트 번호는 해당 컴퓨터에서 실행 중인 프로세스나 서비스를 식별 하는데 사용된다. 웹에 포트 번호를 표현 할 때는 :주소 뒤에 :443을 적는다
포트
notion image

소켓

💡
클라이언트 소켓과 서버 소켓이 있다. 프로그램 별로 소켓이 다 있다.

서버 소켓

💡
서버 소켓은 클라이언트로 부터 연결 요청을 감지하는 역할을한다. 서버 소켓이 생성 될 때 서버 소켓이랑 서버 소켓 내부에 리스너가 생성이 된다. 리스너는 클라이언트의 연결 요청을 감지하고 수락하는 역할을 한다. 새로운 소켓:클라이언트랑 서버가 연결이 되고 나서 데이터 통신을 하기 위해서 다른 하나의 소켓을 만드는데 새로운 소켓에게 클라이언트와의 통신을 위임한다. 새로운 클라이언트가 만들어 질 때마다 새로운 소켓을 만들어 내는 이유는 데이터 통신이 클라이언트와 새로 만든 소켓을 통해 이루어지기 때문에 동시에 여러 클라이언트와 통신하기 위해서다.
 
 

공유기를 사용한 가정 집 내부 컴퓨터들에 통신 방법

💡
일반 가정집에서는 보통 공유기를 설치해 가정집 내부 컴퓨터들의 ip를 공유기 ip하나로 통제한다 그 이유는 ip주소를 딸 때 마다 돈을 내야 되기 때문이다. 일반 가정집에서 다른 집으로 통신을 보낼 때 공유기를 사용해서 통신을 하는 방법은 다음과 같다. A가정 집에서 데이터를 쏘면 라우터로 간다. 라우터에서 B가정집의 공유기 ip주소를 확인하여 B가정집 공유기로 데이터를 전달한다. 공유기로 데이터가 들어오면 패킷이 B가정집에 컴퓨터 가상 ip주소를 보고 컴퓨터에게 데이터를 전달한다. 이것을 풀어서 설명하면 밑 내용과 같다
데이터 전송:1가정집의 컴퓨터에서 데이터를 전송하면, 데이터는 해당 가정집의 라우터로 전송됩니다.라우터는 네트워크 트래픽을 관리하고, 데이터를 다른 네트워크로 전달하기 위한 역할을 합니다.라우터에서의 처리:라우터는 공유기의 IP 주소를 확인하여 데이터를 전송해야 할 대상인 다른 가정집의 공유기로 데이터를 전달합니다.이때, 라우터는 네트워크 주소 변환(Network Address Translation, NAT)을 사용하여 전송할 데이터의 출발지 IP 주소를 1가정집의 IP 주소로 변경합니다.공유기 간 통신:데이터가 1가정집의 공유기에서 다른 가정집의 공유기로 도달하면, 목적지 가정집의 공유기는 해당 데이터를 받습니다.이때, 목적지 가정집의 공유기는 가정집 내부에 연결된 컴퓨터를 식별하기 위해 가상 IP 주소를 사용합니다.가상 IP 주소는 가정집 내부 네트워크에서 사용되며, 가정집 내부의 컴퓨터를 고유하게 식별하는 데 사용됩니다.2가정집 컴퓨터로의 전달:목적지 가정집의 공유기는 가상 IP 주소를 확인하여 데이터를 해당 가정집의 컴퓨터로 전달합니다.이때, 목적지 가정집의 공유기는 네트워크 주소 변환(NAT)을 사용하여 전송할 데이터의 목적지 IP 주소를 해당 컴퓨터의 실제 IP 주소로 변경합니다.
예시 사진
notion image

루프백

💡
자기 컴퓨터 내에서 프로그램끼리 통신하는것을 루프백이라고하며. 컴퓨터 마다 localhost 또는 1270.0.0.1 이라는 루프백 ip가있다.
 
 
단방향 예제
package ex17oneway; // import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(10000); // 클라이언트의 연결 요청이 들어올 때까지 기다립니다. 연결 요청이 들어오면 그 요청을 수락하고, // 해당 클라이언트와 연결된 Socket 객체를 생성하여 반환합니다. 이 Socket 객체를 통해 클라이언트와 데이터를 주고받을 수 있습니다. Socket socket = serverSocket.accept(); System.out.println("클라이언트 연결됨"); // 클라이언트와 연결된 Socket 객체로부터 입력 스트림을 얻습니다. 이 입력 스트림을 통해 클라이언트로부터 보내진 데이터를 읽을 수 있습니다. BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream(), "UTF-8") ); // 클라이언트로부터 보내진 데이터를 계속해서 읽습니다. while (true) { String msg = br.readLine(); // 만약 클라이언트로부터 보내진 데이터가 없으면, 반복문을 빠져나갑니다. if (msg == null) { break; } // 클라이언트로부터 보내진 데이터를 출력합니다. System.out.println(msg); } } catch (IOException e) { throw new RuntimeException(e); } } }
package ex17oneway; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.Scanner; //요청하는자:클라이언트가 된다. //요청을 받는 애:서버 public class Client { public static void main(String[] args) { // lochl hast = 127.0.0.1 (루프백) Socket socket;// ip, prot { try { socket = new Socket("127.0.0.1", 10000); Scanner sc = new Scanner(System.in); String msg = sc.nextLine(); //가나다라abc BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "UTF-8") //통신할때 UTF-8 ); bw.write(msg+"\n"); bw.write(msg); bw.flush(); } catch (IOException e) { e.printStackTrace(); } } } }
💡
인코딩 될 때 예시로 가나다라abc를 몇 바이트인지 알아야지 올바르게 쪼갤 수 있기 때문에 UTF-8(유니코드 문자를 표현 하기 위한 가변 길이 문자 인코딩 방식)로 설정한다.
 
소켓 통신 코드 실행 시킬때 변경해야 할것
notion image
 
Share article
RSSPowered by inblog