인터넷이 개발되면서 전통적인 HTTP 프로토콜은 웹 애플리케이션의 점점 더 복잡한 요구를 충족시키기가 어려웠습니다. 최근 몇 년 동안 HTML5의 탄생으로 WebSocket 프로토콜이 제안되었습니다. 브라우저와 서버 간의 전이중 통신을 인식하고 브라우저와 서버 간의 통신 기능을 확장하며 서버가 클라이언트에 데이터를 적극적으로 전송할 수 있습니다.
기존의 HTTP 프로토콜은 상태가 없습니다. 각 요청은 클라이언트 (예 : 브라우저)가 시작해야합니다. 처리 후 서버는 응답 결과를 반환합니다. 서버가 클라이언트에 데이터를 적극적으로 전송하는 것은 어렵습니다. 이런 종류의 클라이언트는 활성 파티이고 서버는 수동적 파티입니다. 기존 웹 모델은 드문 정보가 변경되는 웹 애플리케이션에 덜 문제를 일으키지 만 인스턴트 커뮤니케이션, 실시간 데이터, 구독 푸시 등과 같은 기능을 갖춘 실시간 정보와 같은 실시간 정보와 관련된 웹 애플리케이션에 큰 불편 함을 불러 일으 킵니다. WebSocket 사양이 제안되기 전에, 개발자는 종종 실시간 함정을 구현하기 위해 종종 트레이드 오프 솔루션을 구현하기 전에 : 폴링 및 코트 기술을 구현합니다. 실제로 후자는 본질적으로 일종의 여론 조사이지만 개선되었습니다.
폴링은 실시간 웹 애플리케이션을 구현하기위한 가장 독창적 인 솔루션입니다. 폴링 기술을 사용하려면 고객이 정해진 시간 간격으로 서버에 요청을 주기적으로 보내야하며 새로운 데이터 변경이 있는지 자주 쿼리해야합니다. 분명히이 접근법은 너무 많은 불필요한 요청으로 이어질 수 있으며 트래픽 및 서버 리소스를 낭비합니다.
혜성 기술은 긴 폴링 및 스트리밍 기술로 나눌 수 있습니다. 긴 폴링은 위에서 언급 한 투표 기술을 향상시켜 쓸모없는 요청을 줄입니다. 특정 데이터에 대한 만료 시간을 설정하고 데이터가 만료 된 후에만 서버에 요청을 보냅니다. 이 메커니즘은 데이터 변경이 특히 빈번하지 않은 상황에 적합합니다. 스트리밍 기술은 일반적으로 숨겨진 창을 사용하여 서버와의 HTTP 긴 연결을 설정하는 클라이언트를 말합니다. 서버는 HTTP 긴 연결을 유지하기 위해 연결 상태를 지속적으로 업데이트합니다. 이러한 방식으로 서버는이 긴 연결을 통해 클라이언트에 데이터를 적극적으로 보낼 수 있습니다. 스트리밍 기술은 대규모 동시성 환경에서 서버의 성능을 테스트 할 수 있습니다.
두 기술 모두 요청-응답 모드를 기반으로하며 실제 의미에서 실시간 기술로 간주되지 않습니다. 각각의 요청 또는 응답은 동일한 헤더 정보에 대한 일정량의 트래픽을 낭비하며 개발 복잡성도 높습니다.
** HTML5의 출시와 함께 WebSocket은 웹의 실시간 통신을 진정으로 깨닫고 B/S 모드가 C/S 모드의 실시간 통신 기능을 갖습니다. ** WebSocket의 워크 플로우는 다음과 같습니다. 브라우저는 JavaScript를 통해 WebSocket 연결을 설정하기 위해 서버에 요청을 보냅니다. WebSocket 연결이 성공적으로 설정된 후 클라이언트와 서버는 TCP 연결을 통해 데이터를 전송할 수 있습니다. WebSocket 연결은 본질적으로 TCP 연결이므로 각 전송마다 반복적 인 헤더 데이터를 전달할 필요가 없으므로 데이터 전송 볼륨은 폴링 및 혜성 기술보다 훨씬 작습니다. 이 기사는 WebSocket 사양을 자세히 소개하지 않지만 주로 Java Web에서 WebSocket의 구현을 소개하고 WebSocket을 사용하여 채팅방을 구현합니다.
Javaee 7은 WebSocket 사양을위한 JSR-356 : Java API를 만들었습니다. Tomcat, Nginx, Jetty 등과 같은 많은 웹 컨테이너가 WebSocket을 지원합니다. Tomcat은 7.0.27 이후 WebSocket을 지원하고 7.0.47 이후 JSR-356을 지원합니다. 다음 코드는 Tomcat7.0.27 이상에서 실행되어야합니다.
WebSocket 서버 코드
//이 주석은 클라이언트가 WebSocket에 연결할 수있는 URI를 지정하는 데 사용됩니다. 서블릿과 같은 주석 맵핑. Web.xml에서 구성 할 필요가 없습니다. @serverendpoint ( "/websocket") public class webSocketDemo {// 정적 변수의 현재 온라인 연결 수를 기록하는 데 사용됩니다. 스레드-안전하도록 설계되어야합니다. 개인 정적 최종 atomicinteger onlinecount = new atomicinteger (0); // 동시 패키지의 스레드 안전 세트는 각 클라이언트의 해당 MyWebSocket 객체를 저장하는 데 사용됩니다. 서버가 단일 클라이언트와 통신한다는 사실을 알기 위해 MAP를 사용하여이를 저장할 수 있습니다. 여기서 키는 사용자 개인 정적 정적 COPYONWRITEARRAYSET <WebSocketDemo> WebSocketSet = new CopyOnWriteArrayset <WebsocketDemo> ()를 식별 할 수 있습니다. // 클라이언트 개인 최종 문자열 별명을 기록하는 채팅 별명을 정의합니다. // 특정 클라이언트와 연결 세션을 연결하고 클라이언트 개인 세션 세션에 데이터를 보내야합니다. public webSocketDemo () {nickname = "guest" + onlinecount.getAndIncrement (); } / * * @onopen 주석을 사용하여 클라이언트 링크가 성공한 후 반환을 표시하십시오. 매개 변수 세션은 선택적 매개 변수입니다.이 세션은 세션을 나타내는 WebSocket 사양의 세션입니다. httpsession이 아님 */ @onopen public void onopen (세션 세션) {this.session = session; websocketset.add (this); String Message = String.format ( "[%s,%s]", 닉네임, "채팅방에 추가"); 방송 (메시지); System.out.println ( "Onopen"); }/ * * 클라이언트가 메시지를 보내는시기를 나타내는 @onmessage 주석을 사용하고 첫 번째 매개 변수는 사용자가 보낸 데이터를 나타냅니다. 매개 변수 세션은 선택적 매개 변수이며, OnOpen 메소드의 세션과 일치하는 선택적 매개 변수입니다. */@onmessage public void onMessage (문자열 메시지, 세션 세션) {// 물론 true system.out.println (this.session == session); broadcast (string.format ( "%s :%s", 닉네임, 필터 (메시지)); }/ ** 콜백 사용자가 링크를 끊은 후 클라이언트가 깨진 링크 메소드를 호출 한 후이 메소드를 호출해야합니다./ @onclose public void onclose () {websocketSet.remove (this); String Message = String.format ( "[%s,%s]", 닉네임, "채팅방 링크를 남겨 두십시오"); 방송 (메시지); } // Complete Complete Complete Complete Complete Send Private void Broadcast (String info) {for (WebSocketDemo W : WebSocketSet) {try {Synchronized (websocketDemo.class) {w.session.getBasicRemote (). SendText (info); }} catch (ioexception e) {System.out.println ( "클라이언트에게 메시지 보내기"+w.nickName+"메시지를 보내지 못했습니다"); WebsocketSet.remove (w); try {w.session.close (); } catch (ioexception e1) {} string message = string.format ( "[%s,%s]", w.nickname, "distronceded"); 방송 (메시지); }}} // 키워드 차단 등과 같은 사용자 메시지에 대한 필터링 요청을 만들 수 있습니다. . 공개 정적 문자열 필터 (문자열 메시지) {if (message == null) {return null; } 반환 메시지; }}클라이언트 (웹 홈페이지) 코드 :
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> 제목 삽입 제목 </title> <script type = "text/javaScript"> var ws = new WebSocket ( "ws : // localhost : 8080/webSockettest/webSocket"); / * * 세 상태의 변화를 듣습니다. js는 콜백*/ ws.onopen = function (message) {}; ws.onclose = function (message) {}; ws.onmessage = function (message) {showmessage (message.data); }; // 창 닫기 이벤트를 듣습니다. 창이 닫히면 연결이 끊어지기 전에 창이 닫히는 것을 방지하기 위해 WebSocket 연결을 적극적으로 닫으면 서버 측에 예외가 발생합니다. window.onbeforeunload = function () {ws.close (); }; // 연결 함수를 닫습니다 CropedeWeBsocket () {ws.close (); } // 메시지를 보내는 메시지 보내기 () {var input = document.getElementById ( "msg"); var text = input.value; ws.send (텍스트); input.value = ""; } function showMessage (메시지) {var text = document.createtextNode (메시지); var br = document.creeLement ( "br") var div = document.getElementById ( "showchatmessage"); Div.AppendChild (텍스트); Div.AppendChild (BR); }. onclick = "send ()"> </body> </html>위에서 언급했듯이 그룹 채팅 기능이있는 채팅방이 완료됩니다. 확인 과정에서 WebSocket을 사용하면 크로스 도메인 요청을 완료 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.