20.12.18

민주·2021년 1월 17일
  1. JAVA Network

  2. 정의

    • 네트워크는 서로 다른 컴퓨터가 서로 연결 되어있는 망을 의미한다.
    • 인터넷으로 어디까지 제어할수 있는가
  3. network 기초

    • 네트워크가 첫번째 할 일은 목적지 컴퓨터 까지 어떻게 가느냐 이다.
    • 네트워크에서는 주소가 IP주소와 포트번호이다.
    • 이 주소를 알기 쉽게 하기 위해 domain을 사용한다
    • 도착해야 할 목적 컴퓨터를 서버라고 한다
    • 클라이언트는 서버에게 찾아가 요청(request)를 하고 서버는 클라이언트의 요청에 대해서 응답(response) 한다.
    • server가 클라이언트한테 먼저 말을 걸수 없다.
  4. IP 주소 얻기

    - InetAddress.getLocalHost() : 내 컴퓨터 IP얻기 ( 192.168.0.7 )
    - InetAddress.getByName( "도메인" ) : 특정 도메인 IP 찾기
    - 20 : 도메인에 연결된 전체 IP 얻기
    - 대형사이트의 경우는 접속자가 몰리면 과부하가 걸려 하나의 도메인에 여러 IP를 사용한다

  5. TCP(Transmission Control Protocol)
    - TCP는 연결 지향 프로토콜로 , 데이터를 안전하고 정확하게 전달한다.
    - 서버와 클라이언트가 반드시 연결을 해야한다
    - 주고 받은 것을 확인하고 다음 것을 주기 때문에 대답이 느리면 속도가 느리다

    - 서버와 클라이언트가 연결되기 위해서는 소켓이 필요하다.( 소켓 통신 )
    - 통신과 전송에 필요한 모든 것이 소켓에 들어 있기 때문에 소켓이 없으면 아무런 통신이 되지 않는다.
    - 스트림도 소켓에서 뽑아냄

    Ø Server


    1. 서버 소켓 생성 ( ServerSocket )
    - 12 : ServerSocket server = new ServerSocket(); 으로 안해주는 이유는 예외 발생시 서버소켓을 닫아줘야 하기 때문이다.
    - 소켓생성시 예외 발생 위험이 있어 try-catch 해준다.
    2. Client에게 열어줄 IP 개방
    - IP를 잘못입력하면 엉뚱한 곳으로 이동한다.
    3. 요청대기
    - while(true)로 넣어주는 이유는 서버는 계속 요청을 대기 해야 클라이언트가 언제든지 접속할수 있기 때문이다.
    - server.accept() : 접속 수락 , 요청한 클라이언트에 대한 정보가 들어있다.
    § 정보를 Socket에 넣음
    - getRemoteSocketAddres() : 연결된 클라이언트의 주소 반환
    § 반환된 주소 값을 InetSocketAddress에 넣음
    4. 예외 발생시 서버 종료 ( 서버소켓 ) : server.close();
    - 클라이언트가 언제나 접속을 해야하기 때문에 서버는 웬만하면 종료를 하지 않는다

    Ø Clinet


    1. 소켓 생성
    - 그냥 Socket으로 해줘야 한다.
    2. 접속 요청
    - socket.connect() 에서 예외발생 위험 있어 try-catch
    - 16이 성공하면 접속 완료 실패하면 catch문으로 실패가 된다
    3. finally로 성공하든 실패하든 socket 닫아준다

    Ø 접속 과정 ( 이클립스 -> 서버 , cmd -> 클라이언트 )
    1. 이클립스 서버 실행![](https://velog.velcdn.com/images%2Fmingmang17%2Fpost%2F8db8fd65-4057-4e5d-896b-26ece00af253%2Fimage.png)
    
    2. 클라이언트 실행![](https://velog.velcdn.com/images%2Fmingmang17%2Fpost%2Fa9701793-a934-43c0-abd0-33cd56ee5851%2Fimage.png)
    - Client있는 폴더로 이동
    - java chap12.exam02.tcp.Client(패키지이름부터 클래스 이름까지)로 실행
    - 실행하면 클라이언트 소켓 생성 -> 접속요청 -> 접속종료 까지 실행된다.
    3. 접속 확인![](https://velog.velcdn.com/images%2Fmingmang17%2Fpost%2F5a77ae21-1e1e-47a2-a6e8-a8cf8465113d%2Fimage.png)
    - 정상적으로 접속이 된 것을 알 수 있다
    - 실행한뒤 또 실행 하려고 할때 Terminate/Disconnect All을 안해주면 에러가 난다
    - 이는 이미 접속이 됐는데 또 같은 포트로 들어올려고 하기 때문이다

    ★ 전체적인 순서
    - 서버 소켓생성 -> 서버 아이피 개방 -> 서버 요청 대기 -> 클라이언트 소켓생성 -> 클라이언트에서 접속요청 -> 서버에서 요청이 있을 경우 요청에 대한 처리 -> 클라이언트에서 접속여부 확인 -> 접속 종료

  6. Echo Server
    - 응답을 제대로 주는지 확인할 때 에코서버를 사용한다
    - 클라이언트와 서버가 제대로 접속 했다면 스트림을 통해 데이터를 전송할 수 있다.

    Ø Server


    1. 서버 소켓 생성
    2. IP 개방
    3. 요청 대기
    4. 들어오는 데이터 받아주기 : InputStream으로 데이터 받기 (★socket에서 InputStream 받아 옴 )
    - Object스트림은 java - java 통신만 가능.
    - C나 다른 통신을 하고 싶을 때는 inputstream reader, writer를 사용
    5. 받은 데이터 돌려주기 : OutputStream으로 데이터 보내기
    6. 자원 반납
    7. 예외 발생시 서버 소켓 닫기

    Ø Client


    1. 소켓 생성
    2. 소켓을 통해 접속 요청
    3. 예외가 발생하지 않으면 접속 성공
    4. OutputStream으로 데이터 전송
    - 스캐너로 받은 데이터를 전송하고싶으면 아래 두줄 OutputStream 생성 전 추가
    - Scanner scan = new Scanner(System.in);
    - String test = scan.nextLine();
    5. InputStream으로 되돌아온 데이터 받기
    6. 소켓 자원 반납 , 종료

    Ø 데이터 보내는 과정
    1. 서버 실행![](https://velog.velcdn.com/images%2Fmingmang17%2Fpost%2F281c8347-22d0-443f-867b-837ab2e35277%2Fimage.png)
    2. 클라이언트 실행![](https://velog.velcdn.com/images%2Fmingmang17%2Fpost%2Fc297138a-9265-48ce-bad0-bd7fa1a7f33a%2Fimage.png)
    - Client있는 폴더로 이동
    - java chap12.exam02.tcp.EchoClient(패키지이름부터 클래스 이름까지)로 실행
    - 실행하면 클라이언트 소켓 생성 -> 접속요청 -> 데이터전송 -> 데이터받기 -> 접속종료 까지 실행된다.
    3. 데이터 전송 서버에서 확인![](https://velog.velcdn.com/images%2Fmingmang17%2Fpost%2F6a349810-7ece-4935-ada0-7d6944802f02%2Fimage.png)
profile
개발이좋아요

0개의 댓글