문제
1:n 채팅 서버 프로그램입니다 이를 해결하는 프로그램의 다음 실행상태에 대해 빈칸을 채우세요
프로그램의 실행순서 및 실행상태
①
②
1 public static void main( String[] args ) {
2 new MultiClientServer();
S1b public MultiClientServer() {
[Server] 서버 대기중
S11 while ( true ) {
S13 serverSocket.accept();
E001 // 클라이언트에서 연결 요청할 때까지 계속 대기
E002 // [클라이언트1]에서 연결 요청하면 서버는 네트워크 연결 초기화
③
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 // 클라이언트 데이터가 도착할 때까지 계속 대기
E005 // (수신전용스레드와 별개로) 메인 스레드 S16 이후 실행중
S17 System.out.println( "[Server] 클라이언트 연결 : " + client );
[Server] 클라이언트 연결 : Thread[Thread-0,5,main]
S11 while ( true ) {
S13 serverSocket.accept();
E001 // 클라이언트에서 연결 요청할 때까지 계속 대기
E006 // [클라이언트2]에서 보낸 데이터([CHAT] [클라이언트2]안녕하세요)가 도착
⑤
⑥
C21 for( String data = null; ( data =
[Server] 데이터 도착 : Thread[Thread-1,5,main] [CHAT] [클라이언트2]안녕하세요
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] [CHAT] [클라이언트2]안녕하세요
E007 // 데이터([CHAT] [클라이언트2]안녕하세요)를 [클라이언트1]에게 전송
⑦
C3e }
C23 for( ThreadPerClient client : clients ) {
C23 for( ThreadPerClient client : clients ) {
C25 }
C22 in.readLine() )
E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
E009 // [클라이언트1]에서 보낸 데이터([CHAT] [클라이언트1]반갑습니다)가 도착
⑨
C21 for( String data = null; ( data =
[Server] 데이터 도착 : Thread[Thread-0,5,main] [CHAT] [클라이언트1]반갑습니다
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] [CHAT] [클라이언트1]반갑습니다
E010 // 데이터([CHAT] [클라이언트1]반갑습니다)를 [클라이언트1]에게 전송
⑩
C3e }
C23 for( ThreadPerClient client : clients ) {
C23 for( ThreadPerClient client : clients ) {
C25 }
C22 in.readLine() )
E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
프로그램 코드
E001 // 클라이언트에서 연결 요청할 때까지 계속 대기
E002 // [클라이언트1]에서 연결 요청하면 서버는 네트워크 연결 초기화
E003 // 클라이언트 데이터가 도착할 때까지 계속 대기
E004 // [클라이언트2]에서 연결 요청하면 서버는 네트워크 연결 초기화
E005 // (수신전용스레드와 별개로) 메인 스레드 S16 이후 실행중
E006 // [클라이언트2]에서 보낸 데이터([CHAT] [클라이언트2]안녕하세요)가 도착
E007 // 데이터([CHAT] [클라이언트2]안녕하세요)를 [클라이언트1]에게 전송
E008 // 데이터([CHAT] [클라이언트2]안녕하세요)를 [클라이언트2]에게 전송
E009 // [클라이언트1]에서 보낸 데이터([CHAT] [클라이언트1]반갑습니다)가 도착
E010 // 데이터([CHAT] [클라이언트1]반갑습니다)를 [클라이언트1]에게 전송
E011 // 데이터([CHAT] [클라이언트1]반갑습니다)를 [클라이언트2]에게 전송
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();
}
}
}