본문 바로가기
휴지통/휴지통1

JAVA 채팅 프로그램 해설 및 주석하며 리뷰

by Shuming 2015. 12. 24.
반응형

처음부터 다시 주석달면서 정리한 버전의 채팅프로그램.





SimpleServer




ServerChatter Thread





Client





Message








서버가 실행되면, 서버는 accept 상태에서 호출을 기다리게 되고


server = new ServerSocket(3000);

while(true){

s = server.accept(); 까지 실행됨


이후 클라이언트가 실행하면서  

s = new Socket("127.0.0.1",3000); 

으로 서버에 요청을 하면


서버는 s 즉 소켓을 Thread 로 값을 넘겨준다

(소켓타입의 Thread로 반환)

R_ServerChatter chatter = new R_ServerChatter(s); << 이부분

chatter.start(); // Thread 실행



그럼 Thread는 소켓타입으로 반환하여 s 를 저장하고 

public R_ServerChatter(Socket s){

this.s = s; 


갖고 있는 Socket 으로 길을 연다 여기서 형태는 object 타입

try {

ois = new ObjectInputStream(s.getInputStream());

oos = new ObjectOutputStream(s.getOutputStream());

그리고 chatter.start(); 에 의해 run() method가 호출되어.


msg = (R_Message)ois.readObject();


msg에 R_Message 타입으로 object들을 읽어서 넣는다.





* 여기서 Message 객체를 만든 이유는 여러가지 type 의 객체들을 묶어서 통신 하기 위함인데,

 int

 string

 vector

이런식으로 이루어진 data를 통신하기 위해 Message 객체를 따로 두어서 한번에 보낸다

또 여기서 한번에 보낼때 stack에 있는 data (int) , Heap에 저장되는 data (vector)들이 유실되거나

못읽어오는 경우가 발생할 수 있기때문에 serializable 화를 하여 한번에 캡슐화 하는 것이다.




그 뒤 Line 48~ 를 살펴보면 


Contents에 Message의 talk(채팅내용) 이 없을때 까지 while문을 반복시킨다.


String Contents = msg.getTalk();

while(Contents != null){


msg.setTalk(Contents); 

oos.writeObject(msg);

    oos.flush();

System.out.println("process 3 : 전송완료.");


while의 내용은

msg에 ois.readObject(); 으로 클라이언트가 전송한 값이 저장되어 있으므로

이를 setTalk 하여

msg에 저장하고 그 값을 다시 전송하는것이다.






여기서 문제는 값을 다시 받아와서 뿌려줘야 하는데 받았던 값을 계속 뿌려주던 것이다.



*캡쳐하는 와중에도 계속 (Contents+" 저는 서버에요") 라는 문자를 찍어주는 모습




새로운 값을 받아서 contents에 넣고 다시 뿌려주는 작업이 되지 않았는데 이유는


public void run(){

try {

msg = (R_Message)ois.readObject();

String Contents = msg.getTalk();

while(Contents != null){

msg.setTalk(Contents+" 저는 서버에요");

oos.writeObject(msg);

oos.flush();

System.out.println("process 3 : 전송완료.");


msg = (R_Message)ois.readObject();

Contents = msg.getTalk();

}

} catch (Exception e) {}

}//run



flush() 한 뒤로 contents 는 계속 null 값이 아니기 때문에 계속 flush() 만 하고있는것이다.


즉 새로운 값을 입력받고 비교받고 다시 입력받고 이과정이 반복 되야 하기에 

msg = (R_Message)ois.readObject();

Contents = msg.getTalk();


이 부분이 while문에 추가되어야 하는 것이다.







구조는 이러하다 


클라이언트가 입력한 정보를 msg에 넣어 서버로 송신하여 그 내용을 묶어서 다시 클라이언트에 전송한다.


이제 마지막 


4번 과정 즉 클라이언트에 출력만 하면되는데.



class Chat extends Thread{

public void run(){

while(true){

try {

//process - 4 : server에서 받은 내용 수신

msg = (R_Message)ois.readObject();

String uid = msg.getUserid();

String uContents = msg.getTalk();

ta.append(uContents);

System.out.println("process 4 : 수신 완료. 그리고 내용");

System.out.println("--------------------끝.");

} catch (Exception e1) {e1.printStackTrace();}

}

}


}



이런 스레드를 만들어 처리하였다 (굳이 뭐..)


그냥 ta = TextArea에 계속 반복하여 뿌려주는게 전부.



스스로 정리하면서 코딩하니까 미약하게나마 정리가 된다. ㅠㅠ 근데 아직 모르는 부분이 넘많아


4번 왜 반복하는데 계속 안뿌리지? 값이 어디로 날아감 ㅡㅡ?




반응형

댓글