JAVA 프로그래밍

문제

리모컨 하나로 여러 가전을 제어하기 위한 서버 프로그램입니다 이를 해결하는 프로그램의 다음 실행상태에 대해 빈칸을 채우세요 

프로그램의 실행순서 및 실행상태

 
①  
 
 
②  
 
1  public static void main( String[] args ) {  

2   new MultiClientServer();    

S1b  public MultiClientServer() { 

[Server] 서버 대기중

S11    while ( true ) {

S13                     serverSocket.accept();  

E001 // 클라이언트에서 연결 요청할 때까지 계속 대기
                                              
... 

E002 // [TV]에서 연결 요청하면 서버는 네트워크 연결 초기화 
③  
 
S12     Socket socket = 

S15                              new ThreadPerClient( socket, clients );

C1b  public ThreadPerClient( Socket socket, ArrayList<ThreadPerClient> clients ) {

C1e  }

S14     ThreadPerClient client = 

S16     client.start();  

C2b  public void run() {

C22                                      in.readLine() )

E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
                                              
... 

E004 // (수신전용스레드와 별개로) 메인 스레드 S16 이후 실행중 

S17     System.out.println( "[Server] 클라이언트 연결 : " + client );
[Server] 클라이언트 연결 : Thread[Thread-0,5,main]

S11    while ( true ) {

S13                     serverSocket.accept();  

E001 // 클라이언트에서 연결 요청할 때까지 계속 대기
                                              
... 

E005 // [리모컨]에서 연결 요청하면 서버는 네트워크 연결 초기화
④  
 
S12     Socket socket = 

S15                              new ThreadPerClient( socket, clients );

C1b  public ThreadPerClient( Socket socket, ArrayList<ThreadPerClient> clients ) {

C1e  }

S14     ThreadPerClient client = 

S16     client.start();  

C2b  public void run() {

C22                                      in.readLine() )

E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
                                              
... 

E004 // (수신전용스레드와 별개로) 메인 스레드 S16 이후 실행중 

S17     System.out.println( "[Server] 클라이언트 연결 : " + client );
[Server] 클라이언트 연결 : Thread[Thread-1,5,main]

S11    while ( true ) {

S13                     serverSocket.accept();  

E001 // 클라이언트에서 연결 요청할 때까지 계속 대기
                                              
... 

E006 // [리모컨]에서 보낸 데이터([RMTC] [리모컨] POWER)가 도착 
⑤  
 
 
⑥  
 
C21    for( String data = null; ( data = 

[Server] 데이터 도착 : Thread[Thread-1,5,main] [RMTC] [리모컨] POWER

C23     for( ThreadPerClient client : clients ) {

C24      client.write( data );

C3b  public void write( String data ) {

C31     out.println( data );
[Server] 데이터 전송 : Thread[Thread-0,5,main] [RMTC] [리모컨] POWER

E007 // 데이터([RMTC] [리모컨]POWER)를 [TV]에게 전송 
⑦  
 
C3e  }

C23     for( ThreadPerClient client : clients ) {
                                              
... 

C23     for( ThreadPerClient client : clients ) {

C25    }

C22                                      in.readLine() )

E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
                                              
... 

E009 // [리모컨]에서 보낸 데이터([RMTC] [리모컨] RIGHT)가 도착 
⑧  
 
C21    for( String data = null; ( data = 

[Server] 데이터 도착 : Thread[Thread-0,5,main] [RMTC] [리모컨] RIGHT

C23     for( ThreadPerClient client : clients ) {

C24      client.write( data );

C3b  public void write( String data ) {

C31     out.println( data );
[Server] 데이터 전송 : Thread[Thread-0,5,main] [RMTC] [리모컨] RIGHT

E010 // 데이터([RMTC] [리모컨] RIGHT)를 [TV]에게 전송 
⑨  
 
C3e  }

C23     for( ThreadPerClient client : clients ) {
                                              
... 

C23     for( ThreadPerClient client : clients ) {

C25    }

C22                                      in.readLine() )

E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
                                              
... 


프로그램 코드

E001	// 클라이언트에서 연결 요청할 때까지 계속 대기
E002	// [TV]에서 연결 요청하면 서버는 네트워크 연결 초기화 
E003	// 클라이언트 데이터가 도착할 때까지 계속 대기
E004	// (수신전용스레드와 별개로) 메인 스레드 S16 이후 실행중 
E005	// [리모컨]에서 연결 요청하면 서버는 네트워크 연결 초기화
E006	// [리모컨]에서 보낸 데이터([RMTC] [리모컨] POWER)가 도착 
E007	// 데이터([RMTC] [리모컨]POWER)를 [TV]에게 전송 
E008	// 데이터([RMTC] [리모컨]POWER)를 [리모컨]에게 전송 
E009	// [리모컨]에서 보낸 데이터([RMTC] [리모컨] RIGHT)가 도착 
E010	// 데이터([RMTC] [리모컨] RIGHT)를 [TV]에게 전송 
E011	// 데이터([RMTC] [리모컨] RIGHT)를 [리모컨]에게 전송 
	
	import network.MultiClientServer;
	
	public class MultiClientServer_Main
	{	 
1		public static void main( String[] args ) { 	
2			new MultiClientServer();	  	
3		}
	}
	package network;
	import java.net.*;
	import java.util.*;
	
	public class MultiClientServer
	{
		private ServerSocket serverSocket;
		private ArrayList<ThreadPerClient> clients;
		 
S1b		public MultiClientServer() { 
			try {
				serverSocket = new ServerSocket( Network.serverPort );
				clients = new ArrayList<ThreadPerClient>();
				System.out.println( "[Server] 서버 대기중" );
	
S11				while ( true ) {
S12					Socket socket = 
S13					                serverSocket.accept();  
S14					ThreadPerClient client = 
S15					                         new ThreadPerClient( socket, clients );
					clients.add( client ); 
S16					client.start();  
S17					System.out.println( "[Server] 클라이언트 연결 : " + client );
				}
			} catch ( Exception e ) { 
				close();
				e.printStackTrace();
			} 
	
S1e		}
		
		public void close() {
			try {
				for ( ThreadPerClient client : clients ) {
					client.close();
					client.interrupt();
					clients.remove( client );
				}
	
				if ( serverSocket != null ) {
					serverSocket.close();
					serverSocket = null;
				}
			} catch ( Exception e ) {
				e.printStackTrace();
			}
		}
	} 

	package network;	
	import java.io.*;
	import java.net.*;
	import java.util.*;
	
	public class ThreadPerClient extends Thread  
	{
		private Socket socket;
		private BufferedReader in;
		private PrintWriter out;
		private ArrayList<ThreadPerClient> clients;
	
C1b		public ThreadPerClient( Socket socket, ArrayList<ThreadPerClient> clients ) {
			super();
			try {
				this.in = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
				this.out = new PrintWriter( socket.getOutputStream(), true );
				this.socket = socket;
				this.clients = clients;
			} catch ( Exception e ) { 
				e.printStackTrace();
			} 
C1e		}
	
		@Override
C2b		public void run() {
			try {
C21				for( String data = null; ( data = 
C22				                                  in.readLine() )
				                                                 != null; ) {
					System.out.println("[Server] 데이터 도착 : " + this + " " + data );
C23					for( ThreadPerClient client : clients ) {
C24						client.write( data );
					}
C25				}
			} catch ( Exception e ) { 
				close();
				e.printStackTrace();
			} 
C2e		}
	
C3b		public void write( String data ) {
			try {
				if ( this.getState() == Thread.State.TERMINATED ) {
					System.out.println( "[Server] 클라이언트 연결 해제 : " + this );
					close();
				}		
				else if ( out != null ) {
					System.out.println("[Server] 데이터 전송 : " + this + " " + data );
C31					out.println( data );
				}
			} catch ( Exception e ) {
				e.printStackTrace();
			}
C3e		}
	
		public void close() {
			try {
				if( socket != null ) {
					socket.close();
					socket = null;
				}
				if( in != null ) {
					in.close();
					in = null;
				}
				if( out != null ) {
					out.close();
					out = null;
				}
			} catch ( Exception e ) { 
				e.printStackTrace();
			}
		}
	}