서버와 클라이언트가 네트워크를 통해서 채팅하는 문제입니다 이를 해결하는 다음 프로그램을 해석하세요 클라이언트 -> 서버 -> 클라이언트 -> 서버 순서로 번갈아 가면서 순서대로 메시지를 전송합니다
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 [Server]반갑습니다 [Client]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 [Client]안녕하세요 [Server]반갑습니다 [Client]quit [Client]님이 나가셨습니다 |
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 [Server]반갑습니다 [Client]그동안 잘 지내셨어요? [Server]덕분에 잘 지내고 있습니다 [Client]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 [Client]안녕하세요 [Server]반갑습니다 [Client]그동안 잘 지내셨어요? [Server]덕분에 잘 지내고 있습니다 [Client]quit [Client]님이 나가셨습니다 |
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 [Server]반갑습니다 [Client]그동안 잘 지내셨어요? [Server]덕분에 잘 지내고 있습니다 [Client]앗~ 지금 나가봐야 할 것 같아요 죄송합니다 [Server]다음에 뵈요 [Client]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 [Client]안녕하세요 [Server]반갑습니다 [Client]그동안 잘 지내셨어요? [Server]덕분에 잘 지내고 있습니다 [Client]앗~ 지금 나가봐야 할 것 같아요 죄송합니다 [Server]다음에 뵈요 [Client]quit [Client]님이 나가셨습니다 |
네트워크 서버 연결 초기화
서버 소켓 연결
클라이언트에서 서버로 연결 요청시 연결 활성화
서버에서 네트워크 입출력 초기화
서버에서 클라이언트-서버 순서대로 대화 반복
클라이언트가 네트워크로 보낸 데이터 읽고 출력
서버의 입력 데이터를 네트워크로 전송
네트워크 종료
네트워크 클라이언트 연결 초기화
클라이언트에서 서버로 연결 요청
클라이언트에서 네트워크 입출력 초기화
클라이언트에서 클라이언트-서버 순서대로 대화 반복
클라이언트의 입력 데이터를 네트워크로 전송
서버가 네트워크로 보낸 데이터 읽고 출력
네트워크 종료
E001 // 클라이언트에서 네트워크 연결 요청할 때까지 서버는 계속 대기
E002 // 클라이언트에서 네트워크 연결 요청하면 서버는 네트워크 연결 활성화
E003 // 클라이언트 데이터가 도착할 때까지 서버는 계속 대기
E004 // (서버 프로그램과 별개로) 클라이언트 C12 이후 실행중
E005 // 클라이언트에서 '안녕하세요'를 입력
E006 // 데이터([Client]안녕하세요)를 서버로 전송
E007 // 서버에서 '반갑습니다' 입력
E008 // 데이터([Server]반갑습니다)를 클라이언트로 전송
E009 // 클라이언트에서 'quit'을 입력
E010 // 데이터([Client]quit)를 서버로 전송
E011 // 서버 프로그램 종료
E012 // (서버 프로그램과 별개로) 클라이언트 C15 이후 실행중
E013 // 클라이언트 프로그램 종료
// 파일명 : ./Chapter17/NaiveChatServer.java
import java.io.*;
import java.net.*;
import java.util.Scanner;
// 채팅 프로그램의 네트워크 서버 초기 버전
public class NaiveChatServer
{
S1b public static void main( String[] args ) {
try {
System.out.println( "[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요" );
System.out.println( "[Client]님이 들어오실때까지 잠시만 기다려주세요" );
// 네트워크 서버 연결 초기화
// 서버 소켓 연결
ServerSocket serverSocket = new ServerSocket( 7700 );
// 클라이언트에서 서버로 연결 요청시 연결 활성화
S11 Socket socket =
S12 serverSocket.accept();
System.out.println( "[Client]님이 들어오셨습니다" );
// 서버에서 네트워크 입출력 초기화
BufferedReader networkIn = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
PrintWriter networkOut = new PrintWriter( socket.getOutputStream(), true );
Scanner scan = new Scanner( System.in );
// 서버에서 클라이언트-서버 순서대로 대화 반복
while( true ) {
// 클라이언트가 네트워크로 보낸 데이터 읽고 출력
S13 String clientMessage =
S14 networkIn.readLine();
// 클라이언트가 대화 종료
if( clientMessage.contains( "quit" ) ) {
System.out.println( "[Client]님이 나가셨습니다" );
S15 break;
}
S16 System.out.println( "[Client]" + clientMessage );
// 서버의 입력 데이터를 네트워크로 전송
System.out.print( "[Server]" );
S17 String serverMessage =
S18 scan.nextLine();
S19 networkOut.println( serverMessage );
}
// 네트워크 종료
networkIn.close();
networkOut.close();
socket.close();
serverSocket.close();
scan.close();
} catch ( Exception e ) {
e.printStackTrace();
}
S1e }
}
// 파일명 : ./Chapter17/NaiveChatClient.java
import java.io.*;
import java.net.*;
import java.util.Scanner;
// 채팅 프로그램의 네트워크 클라이언트 초기 버전
public class NaiveChatClient
{
C1b public static void main( String[] args ) {
try {
System.out.println( "[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요" );
// 네트워크 클라이언트 연결 초기화
// 클라이언트에서 서버로 연결 요청
C11 Socket socket =
C12 new Socket( "localhost", 7700 );
System.out.println( "[Server]님이 들어오셨습니다" );
// 클라이언트에서 네트워크 입출력 초기화
BufferedReader networkIn = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
PrintWriter networkOut = new PrintWriter( socket.getOutputStream(), true );
Scanner scan = new Scanner( System.in );
// 클라이언트에서 클라이언트-서버 순서대로 대화 반복
while( true ) {
// 클라이언트의 입력 데이터를 네트워크로 전송
System.out.print( "[Client]" );
C13 String clientMessage =
C14 scan.nextLine();
C15 networkOut.println( clientMessage );
// 클라이언트가 대화 종료
if( clientMessage.contains( "quit" ) ) {
System.out.println( "[Client]님이 나가셨습니다" );
C16 break;
}
// 서버가 네트워크로 보낸 데이터 읽고 출력
C17 String serverMessage =
C18 networkIn.readLine();
C19 System.out.println( "[Server]" + serverMessage );
}
// 네트워크 종료
networkIn.close();
networkOut.close();
socket.close();
scan.close();
} catch ( Exception e ) {
e.printStackTrace();
}
C1e }
}
※ 실행순서 및 메모리상태는 A키(이전) 및 D키(다음)를 눌러도 확인할 수 있습니다