[메모]Spring 통합 WebSocket
15684 단어 JavaEESpring5인기 기술 을 통합 하 다.
웹 소켓 이 뭐 예요?
웹 소켓 은 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 모드 를 지원 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.