[WebSocket] 채팅프로그램 | 채팅방 만들기 2
webSocketConfig 클래스 생성
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer{
@Autowired
SocketHandler socketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(socketHandler, "/chating/{roomNumber}");
}
}
SocketHandler 클래스 수정
@Component
public class SocketHandler extends TextWebSocketHandler {
//HashMap<String, WebSocketSession> sessionMap = new HashMap<>(); //웹소켓 세션을 담아둘 맵
List<HashMap<String, Object>> rls = new ArrayList<>(); //웹소켓 세션을 담아둘 리스트 ---roomListSessions
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
//메시지 발송
String msg = message.getPayload();
JSONObject obj = jsonToObjectParser(msg);
String rN = (String) obj.get("roomNumber");
HashMap<String, Object> temp = new HashMap<String, Object>();
if(rls.size() > 0) {
for(int i=0; i<rls.size(); i++) {
String roomNumber = (String) rls.get(i).get("roomNumber"); //세션리스트의 저장된 방번호를 가져와서
if(roomNumber.equals(rN)) { //같은값의 방이 존재한다면
temp = rls.get(i); //해당 방번호의 세션리스트의 존재하는 모든 object값을 가져온다.
break;
}
}
//해당 방의 세션들만 찾아서 메시지를 발송해준다.
for(String k : temp.keySet()) {
if(k.equals("roomNumber")) { //다만 방번호일 경우에는 건너뛴다.
continue;
}
WebSocketSession wss = (WebSocketSession) temp.get(k);
if(wss != null) {
try {
wss.sendMessage(new TextMessage(obj.toJSONString()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
@SuppressWarnings("unchecked")
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//소켓 연결
super.afterConnectionEstablished(session);
boolean flag = false;
String url = session.getUri().toString();
System.out.println(url);
String roomNumber = url.split("/chating/")[1];
int idx = rls.size(); //방의 사이즈를 조사한다.
if(rls.size() > 0) {
for(int i=0; i<rls.size(); i++) {
String rN = (String) rls.get(i).get("roomNumber");
if(rN.equals(roomNumber)) {
flag = true;
idx = i;
break;
}
}
}
if(flag) { //존재하는 방이라면 세션만 추가한다.
HashMap<String, Object> map = rls.get(idx);
map.put(session.getId(), session);
}else { //최초 생성하는 방이라면 방번호와 세션을 추가한다.
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("roomNumber", roomNumber);
map.put(session.getId(), session);
rls.add(map);
}
//세션등록이 끝나면 발급받은 세션ID값의 메시지를 발송한다.
JSONObject obj = new JSONObject();
obj.put("type", "getId");
obj.put("sessionId", session.getId());
session.sendMessage(new TextMessage(obj.toJSONString()));
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
//소켓 종료
if(rls.size() > 0) { //소켓이 종료되면 해당 세션값들을 찾아서 지운다.
for(int i=0; i<rls.size(); i++) {
rls.get(i).remove(session.getId());
}
}
super.afterConnectionClosed(session, status);
}
private static JSONObject jsonToObjectParser(String jsonStr) {
JSONParser parser = new JSONParser();
JSONObject obj = null;
try {
obj = (JSONObject) parser.parse(jsonStr);
} catch (ParseException e) {
e.printStackTrace();
}
return obj;
}
}
- @SuppressWarnings("unchecked") : 모든 점검 경고는 프로그램 실행 도중에 ClassCastException이 발생할 가능성을 나타낸다. 형 안전성을 보장한다는 사실을 입증할 수 있다면, 해당 어노테이션을 사용해 해당 경고를 억제하되 어노테이션 적용 범위는 최소화 하자. 그리고, 경고 메시지를 억제한 이유를 주석을 통해 알리자.
chat.jsp | javascript 부분
var ws;
function wsOpen(){
//웹소켓 전송시 현재 방의 번호를 넘겨서 보낸다.
ws = new WebSocket("ws://" + location.host + "/chating/"+$("#roomNumber").val());
wsEvt();
}
function wsEvt() {
ws.onopen = function(data){
//소켓이 열리면 동작
}
ws.onmessage = function(data) {
//메시지를 받으면 동작
var msg = data.data;
if(msg != null && msg.trim() != ''){
var d = JSON.parse(msg);
if(d.type == "getId"){
var si = d.sessionId != null ? d.sessionId : "";
if(si != ''){
$("#sessionId").val(si);
}
}else if(d.type == "message"){
if(d.sessionId == $("#sessionId").val()){
$("#chating").append("<p class='me'>나 :" + d.msg + "</p>");
}else{
$("#chating").append("<p class='others'>" + d.userName + " :" + d.msg + "</p>");
}
}else{
console.warn("unknown type!")
}
}
}
document.addEventListener("keypress", function(e){
if(e.keyCode == 13){ //enter press
send();
}
});
}
function chatName(){
var userName = $("#userName").val();
if(userName == null || userName.trim() == ""){
alert("사용자 이름을 입력해주세요.");
$("#userName").focus();
}else{
wsOpen();
$("#yourName").hide();
$("#yourMsg").show();
}
}
function send() {
var option ={
type: "message",
roomNumber: $("#roomNumber").val(),
sessionId : $("#sessionId").val(),
userName : $("#userName").val(),
msg : $("#chatting").val()
}
ws.send(JSON.stringify(option))
$('#chatting').val("");
}
#Reference
https://myhappyman.tistory.com/100
Author And Source
이 문제에 관하여([WebSocket] 채팅프로그램 | 채팅방 만들기 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ihj0043/WebSocket-채팅프로그램-채팅방-만들기-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)