전체 채팅
전체 채팅은 채팅서버 관리자나 유료서비스 등으로 전체 채팅사용자를 위한 서비스이다.
해쉬맵을 이용해 사용자를 관리하기 때문에 <String, PrintWriter>
채팅할 때 마다 DB에서 사용자를 조회하지 않아도 된다.
...
Iterator<String> it = clientMap.keySet().iterator();
while (ity.hasNext()) {
mem = ity.next();
PrintWriter it_out = (PrintWriter) clientMap.get(mem);
it_out.println(URLEncoder.encode("##전체##[" + time.format(today) + "] [" + user + "] " + msg, "UTF-8"));
}
...
전체 채팅은 간단하다.
일단 해쉬맵에 있는 사용자를 불러오는 방법은 Iterator로 하면 된다.
Iterator란 자바의 Collection Framework(자료구조)에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법 중 하나이다.
해쉬맵에서 사용자 이름(Key값)을 불러와 Value값인 Printwriter를 이용해 채팅을 보낸다. it_out.println(내용);
--------------------------
방 채팅
방 채팅은 한마디로 같은 방에 있는 사람에게만 채팅이 보내지는 것이다. 이게 일반적인 채팅이라고 할 수 있다.
그러기 위해선 먼저 채팅을 보내는 사람이 어느 방에 있는지를 파악해야한다. 그리고 같은 방에 누가있는지 파악해야한다.
사용자가 들어올때 Hashmap에 사용자의 닉네임과 Printwriter를 저장했다. clientMap.put(name + "@1", out);
(DB를 사용해 파악을 한다면 쉽겠지만 채팅할 때마다 DB를 조회한다면 DB접속이 많아져 추천하지않는다.)
닉네임 뒤에 @방번호를 넣어 사용자를 관리한다. 그리고 방 이동시에 @뒤에 있는 방번호를 해당 방번호로 바꾸면 된다.
...
if (uname.contains("@")) {
int idq = uname.indexOf("@");
uname = uname.substring(0, idq);
}
Iterator<String> it = clientMap.keySet().iterator();
while (it.hasNext()) {
mem = it.next();
if (mem.contains(user))
user = mem; // mname@rloc
}
int idq = user.indexOf("@");
String rmNum = user.substring(idq + 1); // 방번호 추출
String msg = chkBannWord(chkmsg);
int cnt = 0;
Iterator<String> ity = clientMap.keySet().iterator();
while (ity.hasNext()) {
mem = ity.next();
try {
PrintWriter it_out = (PrintWriter) clientMap.get(mem);
it_out.println(URLEncoder.encode("[" + time.format(today) + "] [" + uname + "] " + msg, "UTF-8"));
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
...
'프로젝트 > Java 프로젝트' 카테고리의 다른 글
리스트 보기 (전체사용자, 현재방사용자, 대기실사용자) (0) | 2018.09.25 |
---|---|
채팅하기 2. 귓속말(고정귓속말, 일회성귓속말) (0) | 2018.09.25 |
Connection Pool (0) | 2018.09.24 |
클라이언트측 Sender (0) | 2018.09.24 |
클라이언트측 (0) | 2018.09.24 |