웹소켓 심플 채팅 따라하기 (WebSocket Chatting)

웹소켓 심플 채팅 따라하기 (WebSocket Chatting)

org.springframework spring-websocket ${org.springframework-version} javax.websocket javax.websocket-api 1.1

- Maven

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> Simple Chat 대화방 참여 대회방 나가기 메세지 입력 : 메세지 전송 대화내용 지우기 var ws; var messages = document.getElementById("messages"); function openSocket(){ if(ws !== undefined && ws.readyState !== WebSocket.CLOSED ){ writeResponse("WebSocket is already opened."); return; } //웹소켓 객체 만드는 코드 ws = new WebSocket("ws://localhost:8080/echo.do"); ws.onopen = function(event){ if(event.data === undefined){ return; } writeResponse(event.data); }; ws.onmessage = function(event){ console.log('writeResponse'); console.log(event.data) writeResponse(event.data); }; ws.onclose = function(event){ writeResponse("대화 종료"); } } function send(){ // var text=document.getElementById("messageinput").value+","+document.getElementById("sender").value; var text = document.getElementById("messageinput").value+","+document.getElementById("sender").value; ws.send(text); text = ""; } function closeSocket(){ ws.close(); } function writeResponse(text){ messages.innerHTML += "
"+text; } function clearText(){ console.log(messages.parentNode); messages.parentNode.removeChild(messages) } ​

chat.jsp

package com.devmg.app; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.RemoteEndpoint.Basic; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @ServerEndpoint(value="/echo.do") public class WebSocketChat { private static final List sessionList=new ArrayList();; private static final Logger logger = LoggerFactory.getLogger(WebSocketChat.class); public WebSocketChat() { // TODO Auto-generated constructor stub System.out.println("웹소켓(서버) 객체생성"); } @OnOpen public void onOpen(Session session) { logger.info("Open session id:"+session.getId()); try { final Basic basic=session.getBasicRemote(); basic.sendText("대화방에 연결 되었습니다."); }catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } sessionList.add(session); } /* * 모든 사용자에게 메시지를 전달한다. * @param self * @param sender * @param message */ private void sendAllSessionToMessage(Session self, String sender, String message) { try { for(Session session : WebSocketChat.sessionList) { if(!self.getId().equals(session.getId())) { session.getBasicRemote().sendText(sender+" : "+message); } } }catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } } /* * 내가 입력하는 메세지 * @param message * @param session */ @OnMessage public void onMessage(String message,Session session) { String sender = message.split(",")[1]; message = message.split(",")[0]; logger.info("Message From "+sender + ": "+message); try { final Basic basic=session.getBasicRemote(); basic.sendText("<나> : "+message); }catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } sendAllSessionToMessage(session, sender, message); } @OnError public void onError(Throwable e,Session session) { } @OnClose public void onClose(Session session) { logger.info("Session "+session.getId()+" has ended"); sessionList.remove(session); } }

WebSocketChat.java

package com.devmg.app; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; /** * Handles requests for the application home page. */ @Controller public class LoginController { private static final Logger logger = LoggerFactory.getLogger(LoginController.class); /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "/login.do", method = RequestMethod.GET) public String login() { return "login"; } /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "/loginProcess.do", method = RequestMethod.POST) public String loginProcess(@RequestParam String id, HttpServletRequest request) { logger.info("Welcome "+id); HttpSession session = request.getSession(); session.setAttribute("id", id); return "chat"; } }

LoginController.java

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="false" %> body { background: #f8f8f8; padding: 60px 0; } #login-form > div { margin: 15px 0; } Home 환영합니다! 로그인

Login.jsp

from http://stratum-home.tistory.com/9 by ccl(A) rewrite - 2021-12-19 14:28:10