Java[이것이 자바다 CH19]

이도환·2023년 8월 31일
post-thumbnail

스터디 링크
코드 링크

네트워크 입출력

19.1 네트워크 기초

  • 서버와 클라이언트
    서비스를 제공하는 프로그램을 서버라고 부르고 서비스를 요청하는 프로그램을 클라이언트라고 한다.
  • IP 주소
    네트워크 어댑터에 어떤 IP주소가 부여되어 있는지 확인하려면 터미널에서 ipconfig(윈도우), ifconfig(mac) 을 통해 IP 주소를 출력하는데, XXX.XXX.XXX.XXX(XXX = 0 ~ 255사이의 숫자)
  • port 번호
    서버는 시작할 때 특정 port번호에 바인딩한다. 같은 IP 주소에 다른 Port 번호를 부여하여 각각의 클라이언트가 충돌하지 않고 Port를 사용할 수 있도록 한다.

    위의 번호는 포트 번호의 사용 예시 번호들이다.

19.2 IP주소 얻기

  • 로컬 컴퓨터의 InetAddress를 얻고 싶다면 다음과 같은 메소드를 호출하면 된다.
InetAddress ia = InetAddress.getLocalHost();

만약 컴퓨터의 도메인 이름을 알고 있다면

19.3 TCP 네트워킹

  • IP 주소로 프로그램들이 통신 할 때는 약속된 데이터 전송 규약이 있다. 이것을 전송용 프로토콜이라고 부른다. 인터넷에서 전송용 프로토콜은 TCP, UDP가 있다. TCP는 연결형 프로토콜로, 상대방이 연결된 상태에서 데이터를 주고 받는다. 클라이언트가 연결 요청을 하고 서버가 연결을 수락하면 통신 회선이 고정되고 데이터는 고정 회선을 통해 전달 된다.
    자바는 TCP네트워킹을 위해 java.net 패키지에서 ServerSocketSocket클래스를 제공하고 있다. ServerSocket은 클라이언트의 연결을 수락하는 서버쪽 클래스이고 Socket클래스는 클라이언트에서 양쪽에서 데이터를 주고받을 때 사용되는 클래스이다.
  • TCP 서버
    TCP 서버 프로그램을 개발하려면 우선 ServerSocket 객체를 생성해야 한다. 다음은 50001번 Port에 바인딩 하는 ServerSocket을 생성하는 코드이다.
ServerSocket serverSocket = new ServerSocket(50001);

ServerSocket 객체가 생성 되었다면 연결 요청 수락을 위해 accept()메소드를 실행해야 한다. 아래의 코드는 TCP 서버의 가장 기본적인 형식이다.

package ch19.sec03.exam01;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.netServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerExample{
 private static ServerSocket serverSocket = null;
 public static void main(String[] args) {
  System.out.println("서버 종료 : Q+ Enter");
  // TCP start
  starServer();
  //keyboard 
  Scanner scanner = new Scanner(System in);
  while(true) {
  String key = scanner.nextline():
  if(key.equals("q")){
   break;
  }
 }
 scanner.close();
 //TCP exit
 stopServer();
 }
 public static void startServer(){
 Thread thread = new Thread(){
 @override
 public void run(){
 try{
  serverSocket = new ServerSocket(50001);
  while(true){
  Socket socket = socketServer.accept();
  InetSocketAddress isa = (InetSocketAddress) socket.getRemotesocketAddress();
  System.out.println(isa.gethostName() + "의 연결 요청을 수락함");
  socket.close();
  System.out.println(isa.gethostName() + "의 연결 끊기);
  }
 } catch(IOException e) {
    }
  }
 };
 
//stopserver코드도 비슷한 양식
  • 입출력 스트림으로 데이터 주고 받기
    클라이언트가 연결 요청하고 서버가 수락을 했다면 다음 그림과 같은 양쪽의 Socket객체로부터 각각 입력 스트림과 출력 스트림을 얻을 수 있다.

19.4 UDP 네트워킹

  • UDP는 발신자가 일방적으로 수신자에게 데이터를 보내는 방식으로 TCP보다 데이터 전송 속도가 상대적으로 빠르다.
  • UDP 서버
    UDP 서버를 위한 DatagramSocket 객체를 생성할 때에는 Port번호를 생성자 매개값으로 제공해야 한다.
    TCP의 accept() 대신 recieve()를 사용한다는 점에서 차이점이있다.

19.5 서버의 동시 요청 처리

  • 일반적으로 서버는 다수의 클라이언트와 통신을 한다 서버는 클라이언트들로부터 동시에 요청을 받아서 처리하고 결과를 클라이언트로 보내줘야 한다.

19.6 JSON 데이터 형식

  • 네트워크로 전달하는 데이터가 복잡할수록 구조화된 형식이 필요하다. 네트워크 통신에서 가장 많이 사용되는 데이터 형식은 JSON이다
profile
개발 블로그

0개의 댓글