JAVA 프로그래밍

문제

서버와 클라이언트가 네트워크를 통해서 채팅하는 문제입니다 이를 해결하는 다음 프로그램을 해석하세요 클라이언트 -> 서버 -> 클라이언트 -> 서버 순서로 번갈아 가면서 순서대로 메시지를 전송합니다
서버 클라이언트
[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키(다음)를 눌러도 확인할 수 있습니다