본문 바로가기

개념 정리/Java

[JAVA] 네트워크, 소켓통신


1. TCP/IP 

2. 소켓

3. Socket 클래스

4. ServerSocket 클래스


1. TCP/IP 

· TCP 프로토콜: 데이터 전송 관련된 걸 담당 (email, FTP, HTTP)

· IP 프로토콜: 패킷 교환 네트워크에서 송신-수신 호스트의 데이터 전송 담당

 

· IP 주소: 유일하게 식별 가능한 네트워크 장치의 주소.(localhost의 IP주소는 127.0.0.1)

· DNS(Domain Name System) 서버 : 도메인 이름(문자열)을 IP주소(숫자)로 자동변환해줌

· 포트: 한 컴퓨터 내의 각 응용프로그램이 자신을 식별할 수 있도록 생성된 가상 연결단. 포트번호는 개발자가 임의 선택 가능

* IP주소는 아파트의 동, 포트는 호수.

통신을 수행하는 응용프로그램들은 IP주소와 포트를 이용해 상대편 응용프로그램 인지

 

2. 소켓

- 개발자가 TCP/IP 네트워크 이용해 쉽게 통신프로그램 작성할 수 있도록 지원
- 소켓은 포트와 연결되어 해당 응용프로그램 식별.
- 응용프로그램은 소켓과 연결 후 소켓에 데이터 주면 소켓이 인터넷 경유하여 데이터 주고받음.

 

 

 

[소켓통신 전체 구조]

·서버 소켓 : 클라이언트의 접속을 기다리는 용도로만 사용. (클라이언트가 접속 시, 클라이언트 소켓을 추가로 만들어 통신하게 함)

·클라이언트 소켓 : 데이터 통신 용도

 

 

3. Socket 클래스

- 클라이언트 소켓
- java.net 패키지에 포함된 클래스 (import java.net.*;)

 

 

[Socket 클래스 생성자]

 

[Socket 클래스 메소드]

 

 

[1. 클라이언트 소켓 생성]

// ip주소 128.12.1.1, 포트번호 5500인 서버에 연결하기 위해 소켓 객체 생성, 자동 접속됨.
Socket clientSocket = new Socket("128.12.1.1", 5500);

 

// 빈 소켓 객체 생성 뒤 서버에 접속하는 방법:
Socket clientSocket = new Socket();	// 연결되지 않는 소켓 생성
clientSocket.bind(new InetSocketAddresss("192.168.1.1", 1234));	// 소켓에 자신의 ip와 로컬포트 결합
clientSocket.connect(new InetSocketAddresss("128.12.1.1", 5500));	// 서버 응용프로그램에 접속

 

[2. 네트워크 입출력 스트림 생성]

- 서버와 데이터 주고받을 소켓 스트림 얻어내고 버퍼스트림에 연결

// 문자만 주고받을 수 있는 문자 입출력 스트림
BufferReader in = new BufferedReader(new
                            	InputStreamReader(clientSocket.getInputStream()));
BufferReader out = new BufferedWriter(new
                                OutputStreamWriter(clientSocket.getOutputStream()));

 

[3. 서버에 데이터 전송]

out.write("hi" + "\n");	// 서버에서 라인 단위('\n')로 수신한다고 가정
out.flush();	// 스트림 속 데이터를 즉각 전송.(out은 버퍼가 다 차기 전까지는 데이터 보내지 않기때문)

 

[4. 서버로부터 데이터 수신]

int ch = in.read();	// 서버로부터 한 개의 문자 수신
String line = in.readLine();	// 서버로부터 한 줄('\n')의 문자열 수신

 

[5. 데이터 송수신 종료]

socket.close();

 

4. ServerSocket 클래스

- 서버소켓
- java.net 패키지 (import java.net.*;)
- 클라이언트로부터 연결 요청 기다리는 목적. 데이터 송수신에 사용되지 않음.
- 클라이언트가 접속하면 Socket 객체를 별도 생성, Socket 객체가 클라이언트와 데이터 주고받음.

 

[ServerSocket 생성자]

 

[ServerSocket 메소드]

 

[1. 서버 소켓 생성]

ServerSocket mylistener = new ServerSocket(9999);	// 포트번호는 자신의 포트번호

 

[2. 클라이언트 접속 대기]

- accept() 메소드 이용해 클라이언트의 연결 요청 기다림.

- 연결 수락시, accept()에서 Socket 객체를 별도 생성하여 리턴

Socket socket = mylistener.accept();

 

[3. 네트워크 입출력 스트림 생성]

[4. 클라이언트로 데이터 송수신]

[5. 데이터 송수신 종료]

: 위 Socket 클래스와 동일

 

[6. 서버 응용프로그램 종료]

serverSocket.close();

 

 

 

명품 Java Programming 참고