ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java Communication] 버그수정 & GUI를 이용한 테스트용 자바 채팅 프로그램
    Project 2010. 5. 13. 10:41



    • 입장, 퇴장, 입장, 퇴장 등이 반복하여 일어났을때 생기는 클라이언트 번호 오류 문제를 해결 하였습니다.
    • 기본 제공되는 Message Class 를 최소한으로 줄였습니다.
    • 새로운 Message Class 가 생길때 마다 기존의 Message Class에서 type을 지정하던 것을 변경하여 Message Constants Class를 하나 만들었으며 다른 프로젝트에 적용할 때에는 예제와 같이 상속을 사용함
    • GUI (Swing) 을 이용한 예제


    서버 화면으로 3개로 구분하여 로그가 나오게 하였습니다.

    알림 / 보낸 메세지 / 받은 메세지 순으로 나옵니다.


    클라이언트 화면입니다. 대화명은 테스트이므로 클라이언트 번호로 나오게 하였습니다.



    채팅 서버
    package yhg.comm.test;
    
    import java.io.IOException;
    
    import yhg.comm.message.Message;
    import yhg.comm.server.CommClientManager;
    import yhg.comm.server.CommServer;
    import yhg.comm.server.ICommClientManagerEvent;
    import yhg.comm.server.ICommServerEvent;
    
    public class Server {
    	private CommServer server;
    	private ServerFrame frame;
    	
    	public Server(){
    		frame = new ServerFrame();
    		
    		try {
    			server = new CommServer(1234);
    			setEvent();
    			server.start();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		frame.setVisible(true);
    	}
    	
    	private void setEvent(){
    		server.setServerEvent(new ICommServerEvent(){
    			public void onEnterClient(CommClientManager cm) {
    				frame.addNoticeLog("["+cm.getNumber()+"] Enter");
    				
    				MSGEnterClient msgEC = new MSGEnterClient();
    				msgEC.setClientNumber(cm.getNumber());
    				try {
    					server.sendAll(cm.getNumber(),msgEC);
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    
    			public void onLeaveClient(CommClientManager cm) {
    				frame.addNoticeLog("["+cm.getNumber()+"] Leave");
    
    				MSGLeaveClient msgLC = new MSGLeaveClient();
    				msgLC.setClientNumber(cm.getNumber());
    				try {
    					server.sendAll(cm.getNumber(),msgLC);
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		});
    		
    		server.setClientManagerEvent(new ICommClientManagerEvent(){
    			public void onReceiveMessage(CommClientManager cm, Message msg) {
    				frame.addReceiveLog("[R]["+cm.getNumber()+"]"+msg);
    				
    				switch(msg.getType()){
    					case MSGConstants.type_MSGChat:
    						MSGChat msgC = (MSGChat) msg;
    						msgC.setClientNumber(cm.getNumber());
    						try {
    							server.sendAll(msg);
    						} catch (IOException e) {
    							e.printStackTrace();
    						}
    						break;
    				}
    			}
    
    			public void onSendMessage(CommClientManager cm, Message msg) {
    				frame.addSendLog("[S]["+cm.getNumber()+"]"+msg);
    			}
    		});
    	}
    	
    	public static void main(String[] args){
    		new Server();
    	}
    }
    

    채팅 클라이언트
    package yhg.comm.test;
    
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.IOException;
    import java.net.UnknownHostException;
    
    import yhg.comm.client.CommClient;
    import yhg.comm.client.ICommClientEvent;
    import yhg.comm.message.Message;
    
    public class Client {
    	private CommClient client;
    	private ClientFrame frame;
    	
    	public Client(){
    		frame = new ClientFrame();
    		
    		try {
    			client = new CommClient("127.0.0.1",1234);
    			setEvent();
    			client.start();
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		frame.setVisible(true);
    	}
    	
    	private void setEvent(){
    		client.setClientEvent(new ICommClientEvent(){
    			public void onReceiveMessage(Message msg) {
    				switch(msg.getType()){
    					case MSGConstants.type_MSGEnterClient:
    						MSGEnterClient msgEC = (MSGEnterClient) msg;
    						frame.addNotice(msgEC.getClientNumber()+" 님 입장");
    						break;
    					case MSGConstants.type_MSGLeaveClient:
    						MSGLeaveClient msgLC = (MSGLeaveClient) msg;
    						frame.addNotice(msgLC.getClientNumber()+" 님 퇴장");
    						break;
    					case MSGConstants.type_MSGChat:
    						MSGChat msgC = (MSGChat) msg;
    						frame.addChat(msgC.getClientNumber()+"", msgC.getChat());
    						break;
    				}
    			}
    
    			public void onSendMessage(Message msg) {
    				
    			}
    		});
    		
    		frame.getChatTextField().addKeyListener(new KeyListener(){
    			public void keyPressed(KeyEvent arg0) {}
    
    			public void keyReleased(KeyEvent evt) {
    				if(evt.getKeyCode() != 10)	return ;
    				
    				String chat = frame.getChatTextField().getText();
    				if(chat.length() == 0)	return;
    				
    				MSGChat msgC = new MSGChat();
    				msgC.setChat(chat);
    				
    				try {
    					client.send(msgC);
    					frame.getChatTextField().setText("");
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    
    			public void keyTyped(KeyEvent arg0) {}
    		});
    	}
    	
    	public static void main(String[] args){
    		new Client();
    	}
    }
    

    댓글 4

Designed by Tistory.