JAVA 프로그래밍

문제

리모컨 하나로 여러 가전을 제어하기 위한 서버 프로그램입니다 실행순서를 클릭하세요 
[Server] 서버 대기중
[Server] 클라이언트 연결 : Thread[Thread-0,5,main]
[Server] 클라이언트 연결 : Thread[Thread-1,5,main]
[Server] 데이터 도착 : Thread[Thread-1,5,main] [RMTC] [리모컨] POWER
[Server] 데이터 전송 : Thread[Thread-0,5,main] [RMTC] [리모컨] POWER
[Server] 데이터 전송 : Thread[Thread-1,5,main] [RMTC] [리모컨] POWER
[Server] 데이터 도착 : Thread[Thread-1,5,main] [RMTC] [리모컨] RIGHT
[Server] 데이터 전송 : Thread[Thread-0,5,main] [RMTC] [리모컨] RIGHT
[Server] 데이터 전송 : Thread[Thread-1,5,main] [RMTC] [리모컨] RIGHT 

프로그램 코드

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();
			}
		}
	}








 
실행 순서