처음부터 다시 주석달면서 정리한 버전의 채팅프로그램.
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번 왜 반복하는데 계속 안뿌리지? 값이 어디로 날아감 ㅡㅡ?
'휴지통 > 휴지통1' 카테고리의 다른 글
SQL 6일차 서브 쿼리와 DDL (0) | 2015.12.29 |
---|---|
SQL 5일차 그룹 함수, JOIN (0) | 2015.12.28 |
JAVA - 채팅프로그래밍. (0) | 2015.12.23 |
SQL 4일차 - 주요 함수 (0) | 2015.12.23 |
SQL 3일차 - 데이터 추출하기 (논리연산자...) (0) | 2015.12.22 |
댓글