반응형
- 입장, 퇴장, 입장, 퇴장 등이 반복하여 일어났을때 생기는 클라이언트 번호 오류 문제를 해결 하였습니다.
- 기본 제공되는 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 |
Communication.zip