[메모]Spring 통합 WebSocket

websocket
웹 소켓 이 뭐 예요?
웹 소켓 은 TCP 를 기반 으로 한 네트워크 통신 프로 토 콜 이다.이 는 브 라 우 저 와 서버 의 모든 양 방향 통신 을 실현 하여 서버 가 자발적으로 클 라 이언 트 에 게 정 보 를 보 낼 수 있 도록 합 니 다.
왜 WebSocket 이 필요 합 니까?
HTTP 프로 토 콜 은 무 상태,무 연결,단 방향 응용 층 프로 토 콜 입 니 다.그것 은 요청/응답 모델 을 채택 했다.통신 요청 은 클 라 이언 트 만 할 수 있 고 서버 에서 요청 에 대해 응답 처 리 를 할 수 있 으 며 서버 가 클 라 이언 트 에 게 자발적으로 메 시 지 를 보 낼 수 없습니다.서버 에 연속 적 인 상태 변화 가 있 으 면 클 라 이언 트 가 알 게 되 는 것 은 매우 번 거 로 운 일이 다.대부분의 웹 프로그램 은 잦 은 비동기 AJAX 요청 을 통 해 긴 폴 링 을 할 것 이다.폴 링 의 효율 이 낮 아 자원 을 매우 낭비 하 다.
WebSocket 은 어떻게 일 합 니까?
웹 브 라 우 저 와 서버 는 모두 웹 소켓 프로 토 콜 을 실현 하여 연결 을 구축 하고 유지 해 야 합 니 다.웹 소켓 연결 이 장기 적 으로 존재 하기 때문에 전형 적 인 HTTP 연결 과 달리 서버 에 중요 한 영향 을 미친다.
웹 소켓 서버
javax.websocket 으로 구현
maven 의존 도 추가
<dependency>
    <groupId>javax.websocketgroupId>
    <artifactId>javax.websocket-apiartifactId>
    <version>1.1version>
    <scope>providedscope>
dependency>

웹 소켓 서버 엔 드 정의
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/** 
 * The Apache License 2.0
 * Copyright (c) 2018 sep6th
 * 
 * @ServerEndpoint            ,
 *                   websocket    ,
 *                     URL  ,
 *           URL    WebSocket    
 */
@ServerEndpoint("/websocket")
public class WebSocketServe {
    //    ,           。            。
    private static int onlineCount = 0;

    //concurrent      Set,            MyWebSocket  。
    //                 ,    Map(ConcurrentMap)   ,  Key       
    public static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

    //           ,              
    private Session session;

    /**
     *            
     *
     * @param session      。
     *        session            ,              
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);     //  set 
        addOnlineCount();           //    1
        System.out.println("      !       " + getOnlineCount());
    }

    /**
     *          
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);  // set   
        subOnlineCount();           //    1
        System.out.println("      !       " + getOnlineCount());
    }

    /**
     *              
     *
     * @param message           
     * @param session      
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("        :" + message);
        //    
        for (WebSocketServe item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    /**
     *        
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("    ");
        error.printStackTrace();
    }

    /**
     *     
     */
    public void sendMessage(String msg) throws IOException {
        this.session.getBasicRemote().sendText(msg);

    }

    /**
     *        
     */
    public void sendMsg(String msg) {
        for (WebSocketServe item : webSocketSet) {
            try {
                item.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocketServe.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocketServe.onlineCount--;
    }

}

WebSocket 클 라 이언 트
"java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
<body>
    Welcome<br/><input id="text" type="text"/>
    <button onclick="send()">    button>
    <hr/>
    <button onclick="closeWebSocket()">  WebSocket  button>
    <hr/>
    <div id="message">div>
    <table id="tb" class="altrowstable">
        <th align="center" colspan="9">      th>
    table>
body>

<script type="text/javascript">
    var websocket = null;
    //           WebSocket
    if ('WebSocket' in window) {
        websocket = new WebSocket("ws://localhost:8090/websocket");
    }
    else {
        alert('      Not support websocket')
    }
    //           
    websocket.onerror = function () {
        setMessageInnerHTML("WebSocket      ");
    };
    //           
    websocket.onopen = function () {
        setMessageInnerHTML("WebSocket    ");
    }
    //          
    websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data);
    }
    //         
    websocket.onclose = function () {
        setMessageInnerHTML("WebSocket    ");
    }
    //        ,      ,     websocket  ,             ,server     。
    window.onbeforeunload = function () {
        closeWebSocket();
    }
    //         
    function setMessageInnerHTML(innerHTML) {
        var msg=innerHTML.split(" - ")

        var table=document.getElementById("tb");
         var row;
         row=table.insertRow(1);
        for(var i=0;ivar cell = row.insertCell(i);
             cell.appendChild(document.createTextNode(msg[i]));
        }
        if(table.rows.length>50){
            table.deleteRow(table.rows.length-1);
        }
    }
    //  WebSocket  
    function closeWebSocket() {
        websocket.close();
    }
    //    
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
script>
html>

확장-http 프로 토 콜
HTTP 는 TCP/IP 통신 프로 토 콜 을 기반 으로 데 이 터 를 전달 하 는 무 상태,무 연결,단 방향 응용 층 프로 토 콜 입 니 다.주요 특징:1.간단 하고 빠르다.고객 이 서버 에 서 비 스 를 요청 할 때 요청 방법 과 경 로 를 전송 하기 만 하면 된다.요청 방법 은 GET,HEAD,POST 를 자주 사용 합 니 다.모든 방법 은 고객 과 서버 의 연결 유형 을 규정 하고 있다.HTTP 프로 토 콜 이 간단 하기 때문에 HTTP 서버 의 프로그램 규모 가 작 기 때문에 통신 속도 가 빠르다.2.유연성:HTTP 는 임의의 유형의 데이터 대상 을 전송 할 수 있 습 니 다.전송 중인 형식 은 Content-Type 으로 표 시 됩 니 다.3.연결 없 음:연결 이 없 는 의 미 는 매번 연결 할 때마다 하나의 요청 만 처리 하 는 것 을 제한 하 는 것 이다.서버 는 고객 의 요청 을 처리 하고 고객 의 응답 을 받 은 후 연결 을 끊 습 니 다.이런 방식 을 채택 하면 전송 시간 을 절약 할 수 있다.4.무상 태:HTTP 프로 토 콜 은 무상 태 프로 토 콜 입 니 다.무상 태 란 프로 토 콜 이 사무 처리 에 대한 기억력 이 없다 는 것 을 말한다.상태 가 부족 하 다 는 것 은 후속 처리 에 앞의 정보 가 필요 하 다 면 다시 전송 해 야 한 다 는 것 을 의미한다.그러면 매번 연결 되 어 전송 되 는 데이터 의 양 이 증가 할 수 있다.다른 한편,서버 가 이전 정 보 를 필요 로 하지 않 을 때 응답 이 빠르다.5.B/S 및 C/S 모드 를 지원 합 니 다.

좋은 웹페이지 즐겨찾기