JAVA 프로그래밍

문제

채팅 GUI 클라이언트 문제입니다 이를 해결하는 프로그램의 다음 실행상태에 대해 빈칸을 채우세요 

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

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

3                       new ChatNetworkPanel( serverIP );

CN2b  public ChatNetworkPanel( String serverIP ) {

CN21   this();

CN1b  public ChatNetworkPanel() {

CN1e  } 

CN23             new Network();

N1b  public Network() { 

N1e  }

CN22   network = 

CN24   network.connectAsClient( serverIP, this );

N3b  public void connectAsClient( String serverIP, Runnable obj ) {

N32             new Socket( serverIP, serverPort ); 

E001 // 클라이언트에서 연결 요청하면 서버는 네트워크 연결 초기화

N31    socket = 

N33    connectInOut( obj ); 

N4b  public void connectInOut( Runnable obj ) {

N41    waitForCounterpart.start();

CN4b  public void run() { 

CN42                                             network.read() )

N5b  public String read() {

N52            in.readLine();

E002 // 서버 데이터가 도착할 때까지 계속 대기
                                              
... 

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

N4e  }

N3e  }

CN2e  }
③  
 
2   ChatNetworkPanel panel = 

4  } 
④  
 
E004 // 대화를 입력할 때까지 계속 대기 
                                              
... 

E005 // '안녕하세요' 입력
⑤  
 
 
⑥  
 
CN3b  public void actionPerformed( ActionEvent event ) {

CN31   network.write( header + id + message );  

N6b  public void write( String data ) {

N61     out.println( data );

E006 // 서버로 데이터([CHAT] [클라이언트2]안녕하세요) 전송
⑦  
 
N6e  }

CN3e  }
                                              
... 

E007 // 서버에서 보낸 데이터([CHAT] [클라이언트1]반갑습니다) 도착
⑧  
 
 
⑨  
 
N51     return 

N5e  }

CN41   for ( String message = null; ( message = 

CN43    chatWindow.append( message.substring( header.length() ) + "\n" );
⑩  
 
CN44   }  

CN42                                             network.read() )

N5b  public String read() {

N52            in.readLine();

E002 // 서버 데이터가 도착할 때까지 계속 대기
                                              
... 

E008 // 프로그램 닫기(우측상단 X) 선택  
⑪  
 
 
⑫  
 
Wb    public void windowClosing( WindowEvent event ) { 

W1     panel.close();

CN5b  public void close() {

CN51   network.close();

N7b  public void close() {

N7e  }

CN5e  }

We    }

E009 // 메인스레드와 수신전용스레드가 모두 종료하여 프로그램 종료 
⑬  
 

프로그램 코드

E001	// 클라이언트에서 연결 요청하면 서버는 네트워크 연결 초기화
E002	// 서버 데이터가 도착할 때까지 계속 대기
E003	// (수신전용스레드와 별개로) 메인 스레드 N41 이후 실행중 
E004	// 대화를 입력할 때까지 계속 대기 
E005	// '안녕하세요' 입력
E006	// 서버로 데이터([CHAT] [클라이언트2]안녕하세요) 전송
E007	// 서버에서 보낸 데이터([CHAT] [클라이언트1]반갑습니다) 도착
E008	// 프로그램 닫기(우측상단 X) 선택  
E009	// 메인스레드와 수신전용스레드가 모두 종료하여 프로그램 종료 
	
	import javax.swing.*;
	import java.awt.*;
	import java.awt.event.*;
	import chat.ChatNetworkPanel;
	
	public class ChatGUIClient
	{
1		public static void main( String[] args ) { 	
			String serverIP = "localhost";
2			ChatNetworkPanel panel = 
3			                    new ChatNetworkPanel( serverIP );
	
			JFrame frame = new JFrame( "채팅(클라이언트)" );
			frame.getContentPane().add( panel );
			frame.addWindowListener( new WindowAdapter() {
Wb				public void windowClosing( WindowEvent event ) { 
W1					panel.close();
We				}
			} );
			
			frame.setPreferredSize( new Dimension( 320, 445 ) );	
			frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
			frame.pack();
			frame.setVisible(true);
4		}	
	}
	
	package chat;
	import javax.swing.*;
	import java.awt.*;
	import java.awt.event.*;
	import network.Network;
	
	public class ChatNetworkPanel extends JPanel implements ActionListener, Runnable 
	{	
		private JTextArea  chatWindow;
		private JTextField inputField;
		private Network network;
		private String  id;
		private final String header = "[CHAT] ";
		
CN1b		public ChatNetworkPanel() {
			chatWindow = new JTextArea();
			chatWindow.setBackground( Color.lightGray );
			chatWindow.setEditable( false ); 		
			chatWindow.setLineWrap( true );
			JScrollPane scroll = new JScrollPane( chatWindow );
			scroll.setPreferredSize( new Dimension( 290, 360 ) );	
			add( scroll );
			inputField = new JTextField();
			inputField.setPreferredSize( new Dimension( 290, 30 ) );		
			inputField.addActionListener( this );	
			inputField.requestFocus(); 
			add( inputField );
			setVisible( true );
CN1e		} 
	
CN2b		public ChatNetworkPanel( String serverIP ) {
CN21			this();
	
CN22			network = 
CN23			          new Network();
CN24			network.connectAsClient( serverIP, this );
	
			id = "[" + JOptionPane.showInputDialog( this, "아이디를 입력해주세요.", "아이디" ) + "]";
			network.write( header + id + "님이 들어오셨습니다" );
CN2e		}
		@Override
CN3b		public void actionPerformed( ActionEvent event ) {
			String message = inputField.getText();			                 
CN31			network.write( header + id + message );  
			inputField.setText( "" );
CN3e		}
	
		@Override
CN4b		public void run() {	
CN41			for ( String message = null; ( message = 
CN42			                                          network.read() )
			                                                          != null; ) {
				if ( !message.contains( header ) )
					continue;
	
CN43				chatWindow.append( message.substring( header.length() ) + "\n" );
				chatWindow.setCaretPosition( chatWindow.getText().length() );				
CN44			}  
CN4e		}
	
CN5b		public void close() {
			network.write( header + " " + id + "님이 나가셨습니다" );
CN51			network.close();
CN5e		}
	}

	package network;
	import java.io.*;
	import java.net.*;
	
	public class Network 
	{
		public static final int serverPort = 7700;
		protected ServerSocket serverSocket; 
		protected Socket socket; 
		private BufferedReader in;
		private PrintWriter out; 
		private Thread waitForCounterpart; 
	
N1b		public Network() {	
			serverSocket = null;
			socket = null;
			in = null;
			out = null;
			waitForCounterpart = null;
N1e		}
		
N2b		public void connectAsServer( Runnable obj ) {
			try { 
				serverSocket = new ServerSocket( serverPort ); 
N21				socket = 
N22				         serverSocket.accept();   
N23				connectInOut( obj );  
			} catch ( Exception e ) {
				e.printStackTrace();
			}
N2e		} 
		
N3b		public void connectAsClient( String serverIP, Runnable obj ) {
			try {
N31				socket = 
N32				         new Socket( serverIP, serverPort ); 
N33				connectInOut( obj );	
			} catch ( Exception e ) {
				e.printStackTrace();
			}
N3e		}
	
N4b		public void connectInOut( Runnable obj ) {
			try {
				in = new BufferedReader( new InputStreamReader( socket.getInputStream() ));
				out = new PrintWriter( socket.getOutputStream(), true );
				waitForCounterpart = new Thread( obj );
N41				waitForCounterpart.start();
			} catch ( Exception e ) {
				e.printStackTrace();
			}
N4e		}
		
N5b		public String read() {
			try {
				if ( this.isConnecting() == true )
N51					return 
N52					       in.readLine();
			} catch ( Exception e ) {
				e.printStackTrace();
			}
			
			return null;
N5e		}
		
N6b		public void write( String data ) {
			try {
				if ( this.isConnecting() == true )
N61					out.println( data );
			} catch ( Exception e ) {
				e.printStackTrace();
			}	
N6e		}
	
		public boolean isConnecting() {
			if ( ( socket != null ) 
					&& ( in != null ) 
					&& ( out != null ) 
					&& ( waitForCounterpart != null ) 
					&& ( waitForCounterpart.getState() != Thread.State.TERMINATED ) )   
				return true;
			else 
				return false;
		}
		
N7b		public void close() {
			try {
				if ( waitForCounterpart != null ) {
					waitForCounterpart.interrupt();	  
					waitForCounterpart = null;
				}
				if ( in != null ) {
					in.close();
					in=null;
				}			
				if ( out != null ) {
					out.flush();
					out.close();
					out = null;
				}
				if ( socket != null ) {
					socket.close();
					socket = null;
				}
				if ( serverSocket != null ) {
					serverSocket.close();
					serverSocket = null;
				}
			} catch ( Exception e ) {
				e.printStackTrace();
			}
N7e		}
	}