053_단방향 통신

Jan 09, 2024
053_단방향 통신

통신

  • 통신을 구현하기 위해서는 “소켓”지나야 통신이 되는데 만약 소켓을 지나지 않는 경우는 내 컴퓨터 내의 어딘 가와 연결이 되는 것이라 할 수 있다. → 이런 경우는 소켓이 아니라 “파일” 이라 한다.
  • 소켓 통신양 끝 단에 소켓을 달고 통신을 하는 것으로 소켓끼리 통신 한다고 봐도 된다. → 타겟만 바꾸면 소켓 통신은 가능하다!
  • 통신 시 컴퓨터까지 도착은 IP(Internet Protocol)로 하는데 어떤 프로세스와 통신 할 지는 “포트 번호”가 결정한다.
포트는 프로세스를 결정하는 것이다! 포트의 범위는 2Byte이며, Bit로 바꾸면 2^16인 65536이다!

서버와 클라이언트

  • “클라이언트”“요청 하는 자”의 위치에 있다.
  • “서버”“요청 받는 자”의 위치에 있다.
  • 서버는 소켓이 최소 2개이다. → 서버의 소켓 개수는 (클라이언트 개수 + 1)개 이다. → 다른 소켓을 만드는 이유여러 클라이언트를 연결하여 이용하기 위해서 이다.
  • 서버와 클라이언트가 연결되면 “accept()”가 실행된다. → 서버 소켓은 다른 소켓을 만들고 클라이언트를 거기에 연결 시켜주고 자기 자신과는 끊는다. → 이때 만들어지는 소켓의 포트는 랜덤하게 부여된다.
  • 클라이언트의 소켓은 기본적으로 IP 주소포트를 알아야 한다.
알아두면 좋을 것 같은 정보! 1. 데이터가 라우터까지 내려가면 WWW(World Wide Web,월드 와이드 웹)이 펼쳐진다. 2. 127.0.0.1(localhost)은 루프백 IP이다 → 루프백(loopback)은 자기 자신에게 데이터를 보내는 기능이다. → OS를 중계역할로 해서 스트림을 타고 내려갔다가 올라온다.

서버와 클라이언트 구현

단일 통신(Simplex, 단방향)

  • 서버(Server)
package ex17.oneway; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; // 요청 받는 자(갑) // 서버는 소켓이 최소 2개이다. public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(10000); // 서버 소켓 생성 Socket socket = serverSocket.accept(); // 리스너 (while을 돌면서 확인하는 것이다) : 누가 연결을 하는지 확인 -> 연결이 되면 소켓을 생성 System.out.println("클라이언트 연결됨"); 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); } } }
  • 클라이언트(Clientes)
package ex17.oneway; import java.io.*; import java.net.Socket; import java.util.Scanner; // 요청 하는 자(을) public class Client { public static void main(String[] args) { try { // localhost = 127.0.0.1 (루프백) Socket socket = new Socket("127.0.0.1", 10000); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String msg = br.readLine(); // Scanner sc = new Scanner(System.in); // String msg = sc.nextLine(); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "UTF-8") // 인코딩이 누구인지 알려주는것 안알려주면 상황에 따라 문자가 깨질수도 있다. ); bw.write(msg + "\n"); bw.flush(); } catch (IOException e) { e.printStackTrace(); } } }
단일 통신은 한 쪽에서의 일방적인 통신이라 클라이언트에서 서버로 채팅이 넘어가도록 구현하였다.
Share article

chodong