Project2011.10.06 15:17
우연히 동기의 질문에 오랫만에 다시 YHGCommunication 과 관련된 글을 확인하게 되었습니다.

잘 모르고 빨리 만들다 보니 허접한 코드가 되어 버렸습니다.
이벤트 방식의 메세지 처리, 객체 직렬화 메세지 전송 등 비 효율적인 면이 많이 있었습니다.
이 부분을 좀 더 수정해서 새로운 버전의 YHGComm 을 새로 만들까 하는 욕심이 생깁니다.


주요 수정 사항
1. 받은 메세지 처리 방식 수정
2. 전송되는 메세지 구조 수정
3. 서버에서 다양한 사용자 정보를 관리
4. 사용자 고유 번호 할당
5. Android 에서 UI thread 오류 없이 쉽게 동작

기대 효과
1. 많은 수의 메세지 클래스가 줄어듬
2. 조금 더 효율적인 전송 메세지 크기
3. 서버의 확장성
4. 타 플랫폼(Android)와의 호환성
5. 오류 수정

현재 메세지 처리 방식과 사용자 고유방식 관리에 대해서는 어느 정도 구상이 끝났습니다.
문제가 되는 부분은 전송 메세지 구조입니다. 최소한으로 전송하기 위해 어떻게 해야할지 고민이 되고 있습니다. 
모르는 것이 많다 보니 생각할 것도 많습니다.

언제 작업하고 언제 완성될지 모르겠지만 꼭 해볼렵니다.
이걸 실제로 사용하는 분이 있는지는 모르겠지만...  
신고
Posted by 초프(초보 프로그래머)
Project2010.05.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();
	}
}

신고
Posted by 초프(초보 프로그래머)