-
채팅크루메이트 코드 리뷰!! 2020. 9. 18. 05:04
웹 소켓 연결
function initSocket(url) { socket = new SockJS(url); socket.onmessage = function(evt) { console.log(evt.data + "<br/>"); // 받아온 메세지 넣어주기 messageList(); }; socket.onclose = function(evt) { console.log("연결 종료료"); } $("#sendBtn").on("click", function() { var msg = $("#message").val(); var text = msg + "," + chatingRoomNo; socket.send(text); console.log(text); text = ""; $('#message').empty(); messageList(); }); } $(function(){ initSocket("http://localhost:8080/lastProject/echo?mem_no=" + ${LOGIN_MEMBERINFO.mem_no}); chatRoomList(); $('.chat_list').click(function(){ $('.chat_list').toggleClass('active_chat'); }) })
class파일로 설정한 messageInterceptor
package kr.or.ddit.chat.controller; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{ private static final Logger logger = LoggerFactory.getLogger(MyHandshakeInterceptor.class); @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { logger.debug("beforeHandShake"); HttpServletRequest req = ((ServletServerHttpRequest)request).getServletRequest(); if(req.getParameter("mem_no") != null) attributes.put("mem_no", req.getParameter("mem_no")); System.out.println(req.getParameter("mem_no")); System.out.println("세션걸러주는"); return super.beforeHandshake(request, response, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { logger.debug("afterHandShake"); } }
인터셉터를 거친 후 websocket을 이용하여 메세지를 보내거나 메세지를 받을 때 수행되는 클래스
package kr.or.ddit.chat.controller; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; import kr.or.ddit.chat.service.IChatService; import kr.or.ddit.member.dao.IMemberDAO; import kr.or.ddit.vo.MemberVO; import kr.or.ddit.vo.MessageVO; import kr.or.ddit.vo.ParticipationVO; public class WebSocketChat extends TextWebSocketHandler{ @Autowired IMemberDAO memberDao; @Autowired IChatService chatService; private static final List<WebSocketSession> sessionList=new ArrayList<WebSocketSession>();; private static final Logger logger = LoggerFactory.getLogger(WebSocketChat.class); private static Map<String, Object> userMap; private static Map<String, String> chatingRoomMap; private MemberVO memberInfo = null; public WebSocketChat() { // TODO Auto-generated constructor stub System.out.println("웹소켓(서버) 객체 생"); userMap = new HashMap<String, Object>(); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("after connection est "); logger.info("Open session id:"+session.getId()); String mem_no = getUser(session); userMap.put(mem_no, session); try { sessionList.add(session); session.sendMessage(new TextMessage("Connection Established")); }catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String my_mem_no = getUser(session); System.out.println("my_mem_no" +my_mem_no); System.out.println(message.getPayload()); MessageVO messageInfo = new MessageVO(); String chatingRoomNo = message.getPayload().split(",")[1]; String text = message.getPayload().split(",")[0]; //메세지 삽입 messageInfo.setMem_no(my_mem_no); messageInfo.setMsg_content(text); messageInfo.setCh_no(chatingRoomNo); chatService.insertMessage(messageInfo); sendOneSessionToMessage(my_mem_no, text, userMap, chatingRoomNo); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { System.out.println("after connection closed "); logger.info("Session "+session.getId()+" has ended"); sessionList.remove(session); } private String getUser(WebSocketSession session) { return (String) session.getAttributes().get("mem_no"); } public void serverToClient() throws IOException { for(WebSocketSession wSession : sessionList) wSession.sendMessage(new TextMessage("서버 전송 메세지")); } private void sendOneSessionToMessage(String my_mem_no, String text, Map<String, Object> userMap, String chatingRoomNo) { // 채팅방 번호에 해당하는 유저들 Map<String, String> params = new HashMap<String, String>(); params.put("ch_no", chatingRoomNo); List<ParticipationVO> participationList = null; try { participationList = chatService.participationList(params); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { for(ParticipationVO participationInfo : participationList){ for (String mem_no : userMap.keySet()) { if(participationInfo.getMem_no().equals(mem_no) && !mem_no.equals(my_mem_no)) { WebSocketSession currentSession = (WebSocketSession) userMap.get(mem_no); currentSession.sendMessage(new TextMessage(my_mem_no + " : " + text)); } } } }catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } } }
'크루메이트 코드 리뷰!!' 카테고리의 다른 글
챗봇 (0) 2020.09.18 식단 관리 - 다이어트 일기장 (0) 2020.09.18 식단 관리 - 열량 차트 (0) 2020.09.18 식단 관리 - 나의 식단표 (0) 2020.09.18 식단 관리 - 회원 정보 조회, 등록, 수정, 삭제 (0) 2020.09.18