JAVA Network
정의
network 기초

IP 주소 얻기

- InetAddress.getLocalHost() : 내 컴퓨터 IP얻기 ( 192.168.0.7 )
- InetAddress.getByName( "도메인" ) : 특정 도메인 IP 찾기
- 20 : 도메인에 연결된 전체 IP 얻기
- 대형사이트의 경우는 접속자가 몰리면 과부하가 걸려 하나의 도메인에 여러 IP를 사용한다
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. 이클립스 서버 실행
2. 클라이언트 실행
- Client있는 폴더로 이동
- java chap12.exam02.tcp.Client(패키지이름부터 클래스 이름까지)로 실행
- 실행하면 클라이언트 소켓 생성 -> 접속요청 -> 접속종료 까지 실행된다.
3. 접속 확인
- 정상적으로 접속이 된 것을 알 수 있다
- 실행한뒤 또 실행 하려고 할때 Terminate/Disconnect All을 안해주면 에러가 난다
- 이는 이미 접속이 됐는데 또 같은 포트로 들어올려고 하기 때문이다
★ 전체적인 순서
- 서버 소켓생성 -> 서버 아이피 개방 -> 서버 요청 대기 -> 클라이언트 소켓생성 -> 클라이언트에서 접속요청 -> 서버에서 요청이 있을 경우 요청에 대한 처리 -> 클라이언트에서 접속여부 확인 -> 접속 종료
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. 서버 실행
2. 클라이언트 실행
- Client있는 폴더로 이동
- java chap12.exam02.tcp.EchoClient(패키지이름부터 클래스 이름까지)로 실행
- 실행하면 클라이언트 소켓 생성 -> 접속요청 -> 데이터전송 -> 데이터받기 -> 접속종료 까지 실행된다.
3. 데이터 전송 서버에서 확인