반응형
- 입장, 퇴장, 입장, 퇴장 등이 반복하여 일어났을때 생기는 클라이언트 번호 오류 문제를 해결 하였습니다.
- 기본 제공되는 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(); } }
반응형
'Project' 카테고리의 다른 글
새 버전 업그레이드 진행중 (0) | 2011.01.09 |
---|---|
`중앙대 식단 정보` 를 만들기 위한 작업 (2) | 2010.11.25 |
[Java Communication] Message Class 수정, 동기식 클라이언트 추가 (0) | 2010.03.21 |
[Java Communication] 안드로이드와 데스크탑에서의 채팅 (0) | 2010.03.10 |
[Java Communication] 버그 수정 (0) | 2010.03.10 |