

1.TCP 기본원리
1. 서버 측 설정
1.1 소켓 생성 (socket())
서버는 먼저 소켓을 생성하여 통신을 위한 엔드포인트를 만든다. 이 소켓은 네트워크에서 데이터를 주고받는 데 사용됩됨.
1.2 바인딩 (bind())
서버는 소켓을 특정 IP 주소와 포트 번호에 바인딩한다. 이 단계는 서버가 클라이언트의 연결 요청을 받을 수 있도록 준비하는 과정이다.
1.3 연결 대기 (listen())
서버는 소켓을 리스닝 상태로 설정하여 클라이언트의 연결 요청을 기다립니다. 이 단계에서는 서버가 특정 포트에서 들어오는 연결을 대기하게 된다.
1.4 연결 수락 (accept())
서버는 클라이언트의 연결 요청이 들어오면 이를 수락한다. accept() 함수는 연결 요청이 올 때까지 블로킹되며, 요청이 오면 새로운 소켓을 생성하여 클라이언트와의 통신을 담당한다. 이 새 소켓은 connectionSocket이라고 불린다.
2. 클라이언트 측 설정
2.1 소켓 생성 (socket())
클라이언트도 서버와 통신하기 위해 소켓을 생성한다. 클라이언트 소켓은 서버와의 연결을 설정하는 데 사용된다.
2.2 서버에 연결 (connect())
클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 서버에 연결 요청을 보낸다. 이 과정에서 클라이언트와 서버 간에 TCP 연결이 설정된다.
3. 데이터 통신
3.1 데이터 요청 (write())
연결이 설정되면 클라이언트는 서버에 데이터를 전송할 수 있다. 클라이언트는 write() 메서드를 사용하여 데이터를 서버로 보낸다.
3.2 데이터 수신 및 처리 (read())
서버는 read() 메서드를 사용하여 클라이언트로부터 데이터를 읽는다. 서버는 받은 데이터를 처리하고, 처리 결과를 클라이언트에게 보낸다.
3.3 데이터 응답 (write())
서버는 처리된 데이터를 클라이언트에게 응답으로 보낸다. 클라이언트는 서버의 응답을 받기 위해 read() 메서드를 사용한다.
4. 연결 종료
4.1 클라이언트 연결 종료 (close())
클라이언트는 서버와의 데이터 통신이 끝나면 소켓을 닫아 연결을 종료한다. 이를 통해 클라이언트는 EOF(End of File) 알림을 서버에 보낸다.
4.2 서버 연결 종료 (close())
서버도 클라이언트와의 통신이 완료되면 소켓을 닫아 연결을 종료한다. 이를 통해 서버는 클라이언트와의 통신을 끝마친다.
2. 자바코드 예시 - 서버코드
ServerSocket welcomeSocket = new ServerSocket(6789);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
String clientSentence = inFromClient.readLine();
String capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
1. 서버 소켓 생성
ServerSocket welcomeSocket = new ServerSocket(6789);
2. 클라이언트 연결 대기
while (true) {
Socket connectionSocket = welcomeSocket.accept();
서버는 무한 루프를 사용하여 계속해서 클라이언트의 연결 요청을 기다린다. accept() 메서드는 클라이언트의 연결 요청을 수락하고, 새로운 소켓 객체 connectionSocket을 반환한다. 이 소켓은 클라이언트와의 실제 데이터 통신을 담당한다.
3. 입력 및 출력 스트림 생성
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
connectionSocket을 통해 클라이언트와 데이터를 주고받기 위해 입력 스트림과 출력 스트림을 생성한다. BufferedReader는 클라이언트로부터 데이터를 읽고, DataOutputStream은 클라이언트에게 데이터를 보낸다.
4. 클라이언트로부터 데이터 읽기
String clientSentence = inFromClient.readLine();
5. 데이터 처리 및 응답
String capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
2. 자바코드 예시 - 클라이언트 코드
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
System.out.println("서버에 보낼 메시지를 입력하세요: ");
String sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
String modifiedSentence = inFromServer.readLine();
System.out.println("서버로부터의 응답: " + modifiedSentence);
clientSocket.close();
1. 클라이언트 소켓 생성 및 서버 연결
Socket clientSocket = new Socket("localhost", 6789);
이 코드는 서버의 IP 주소 localhost와 포트 번호 6789를 사용하여 서버에 연결을 요청한다. Socket 객체 clientSocket을 생성하여 서버와의 연결을 설정한다.
2. 입력 및 출력 스트림 생성
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
3. 사용자로부터 메시지 입력 받기
System.out.println("서버에 보낼 메시지를 입력하세요: ");
String sentence = inFromUser.readLine();
클라이언트는 사용자로부터 보낼 메시지를 입력받아 변수 sentence에 저장한다.
4. 서버로 메시지 전송
outToServer.writeBytes(sentence + '\n');
입력받은 메시지를 서버로 전송한다. 메시지 끝에 줄 바꿈 문자 \n을 추가하여 서버가 메시지의 끝을 인식할 수 있도록 한다.
5. 서버로부터 응답 받기
String modifiedSentence = inFromServer.readLine();
System.out.println("서버로부터의 응답: " + modifiedSentence);
서버로부터 응답 메시지를 읽어 변수 modifiedSentence에 저장하고, 이를 출력한다.
6. 클라이언트 소켓 닫기
clientSocket.close();
데이터 통신이 끝나면 클라이언트 소켓을 닫아 연결을 종료한다.
'개발 > java' 카테고리의 다른 글
자바에서 자주 사용되는 자료구조와 자료형 간단 정리 (0) | 2024.07.15 |
---|---|
일반 클래스, 람다식, 익명 클래스 예시 (0) | 2024.07.12 |
Java의 람다 표현식 과 스트림 (0) | 2024.07.12 |
Java의 익명 클래스 (0) | 2024.07.12 |
객체지향 프로그래밍의 4가지 요소(3) 다형성 (0) | 2024.07.12 |
