728x90
소켓 프로그래밍 : Socket Programming
목차
1. 소켓(Socket)이란 무엇인가
2. 소켓을 사용하지 않는다면
3. 소켓 API를 이용한 통신 과정
4. Java Socket API를 이용하여 서버와 통신해보자
5. blocked 상태를 해소하는 방법
1. 소켓(Socket)이란 무엇인가
OS에서 네트워킹을 위해 프로토콜 스택을 쉽게 이용할 수 있도록 제공하는 인터페이스이다.
소켓을 이용하기 위해선 서버의 포트 번호(0~65535)와 IP 주소가 필요하다.
TCP, UDP 프로토콜 마다 다른 소켓 API가 존재한다.
2. 소켓을 사용하지 않는다면
클라이언트와 서버 애플리케이션에서 프로토콜 스택을 헤더에 적층하고 해석하는 과정을 일일히 정의해야 하므로 번거로워 진다.
3. 소켓 API를 이용한 통신 과정
1) 서버 소켓 실행 흐름
- 소켓 생성 및 바인드 : welcoming socket을 생성하여 포트를 할당하고 클라이언트로부터 연결을 받을 수 있도록 준비한다.
- listen & accept : 루프를 돌면서 클라이언트로부터의 요청을 기다린다. 요청이 들어오면 새로운 소켓을 포트에 할당하여 클라이언트와 통신할 준비를 한다. 이 단계에서 서버는 blocked 상태이다.
- communication : 클라이언트와 서버가 서로 데이터를 주고 받는다.
- terminate : 소켓 프로그래밍을 종료한다.
새로운 클라이언트로부터 요청이 들어올 때 마다 서버는 welcoming socket을 이용하여 새로운 소켓을 생성하고 클라이언트와 연결한다. 따라서, 하나의 서버는 여러개의 클라이언트를 처리할 수 있다.
2) 클라이언트 소켓 실행 흐름
- 소켓 생성 및 연결 : 서버 포트와 IP를 매개변수로 소켓을 생성하여 서버와 연결한다.
- communication : 클라이언트와 서버가 서로 데이터를 주고 받는다.
- terminate : 소켓 프로그래밍을 종료한다.
4. Java Socket API를 이용하여 서버와 통신해보자
1) Server Socket Programming
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
try {
// welcoming socket을 생성한다.
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true){
// java의 accept() 함수에는 listen()의 과정 또한 포함되어 있다.
// welcoming socket을 이용해 요청을 기다리고 클라이언트와 통신할 소켓을 생성한다.
Socket connectionSocket = welcomeSocket.accept();
// 클라이언트와 데이터를 주고 받으며, 일반적인 IO 작업과 다를 바가 없다.
BufferedReader inFromClient
= new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient
= new DataOutputStream(connectionSocket.getOutputStream());
// 클라이언트로부터 데이터를 읽어온다.
clientSentence = inFromClient.readLine();
// 데이터를 처리한다.
capitalizedSentence = clientSentence.toUpperCase() + '\n';
// 데이터를 내보낸다.
outToClient.writeBytes(capitalizedSentence);
} catch(IOException e) {
// error handling
}
}
}
2) Client Socket Programming
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(STring argv[]) throws Exception
{
String sentence;
String modifiedSentence;
try {
Socket clientSocket = new Socket("hostname", 6789);
BufferedReader inFromUser
= new BufferedReader(new InputStreamReader(System.in));
DataOutputStream outToServer
= new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer
= new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
} catch (IOException e) {
// error handling
}
}
NOTE
1) "hostname"; 127.0.0.1 : 같은 PC 내에서 서버 처럼 사용할 수 있도록 할당된 특별한 IP이다.
5. blocked 상태를 해소하는 방법
클라이언트의 요청이 들어올 때까지 서버는 아무것도 하지 않는 상태가 된다. 이는 서버의 Utilization을 저하시키는 행위이다. 이 때, Multithread를 사용하여 Utilization을 향상시킬 수 있다.
728x90
'프로그래밍 > 네트워크' 카테고리의 다른 글
[네트워크] 응용 계층 : Application layer (0) | 2024.10.04 |
---|---|
[네트워크 시리즈] 패킷 전송 과정에서 발생하는 delay (0) | 2024.09.11 |
[네트워크 시리즈] 네트워크란 무엇일까 : Network Overview (3) | 2024.09.05 |