시나리오 : 백엔드 업데이트 데이터는 클라이언트에게 푸시됩니다 (Java 부품은 Tomcat 서버를 사용합니다).
폴링, 혜성 및 WebSocket과 같은 백엔드에서 데이터를 추진하기위한 많은 솔루션이 있습니다.
1. 폴링은 백엔드의 최저 개발 비용이며, 이는 AJAX 요청을 처리하고 전통적인 방식으로 데이터를 반환하는 것을 의미합니다. 내가 학교에있을 때 실험실 프로젝트는 항상 여론 조사를 사용했습니다. 그러나 투표로 인한 커뮤니케이션 자원 낭비는 무시할 수 없습니다. 데이터 변경 여부에 관계없이 요청은 평소와 같이 전송되고 응답되며 각 HTTP 요청에는 긴 헤더 정보가 있습니다.
2. 혜성의 개념은 긴 연결입니다. 클라이언트가 요청을 보낸 후, 백엔드는 연결 시간이 설정되거나 백엔드가 데이터를 반환 할 때까지 연결을 유지 한 다음 연결을 다시 설정하여 통신 리소스를 서버로 효과적으로 전송하여 실제로 서버 리소스를 소비합니다.
3. WebSocket은 HTML5에서 제공하는 전이중 통신 기술입니다. "핸드 셰이크"를 통해 클라이언트와 서버 간의 커뮤니케이션을 실현합니다. 실시간 성능이 우수하고 작은 머리가 있습니다. 현재 지원되는 브라우저는 다음과 같습니다.
이상적인 상황은 WebSocket과 Comet의 조합을 사용하고 혜성 방법을 사용하여 IE8과 같은 브라우저를 다운 그레이드하는 것입니다. 그러나 이러한 방식으로 백엔드는 요청 처리를위한 두 가지 논리, 즉 WebSocket 및 Comet을 구현해야합니다. 따라서이 기사는 Node.js를 추가했습니다. 이를 수행하는 이유는 WebSocket (또는 Comet)을 Node.js 부분으로 처리하는 논리를 전송하고 실제 상황에서는 프론트 엔드 개발자가 백엔드 개발자를 홍보하는 것이 쉽지 않기 때문에 백엔드에 "문제를 유발하지 않습니다. Node.js는 브라우저와 Java 비즈니스 로직 계층 간의 통신을위한 중간 계층이며 클라이언트를 Tomcat에 연결하고 소켓을 통해 Tomcat과 통신합니다 (WebSocket이 아닌 소켓이므로 백엔드는 소켓 인터페이스를 구현해야합니다.
클라이언트에서 WebSocket과 Comet은 Socket.io를 통해 구현됩니다. Socket.io는 다른 브라우저 버전 또는 다른 클라이언트에 대한 적절한 구현 방법 (WebSocket, Long Pull ..)을 선택합니다. socket.io를 도입하면 WebSocket (또는 긴 연결)을 쉽게 처리 할 수 있습니다. socket.io
클라이언트는 socket.io를 소개합니다.
<script src = "static/js/socket.io.js"> </script>
클라이언트 자바 스크립트 코드 :
var socket = io.connect ( '127.0.0.1:8181'); // 서버 socket.emit로 데이터를 전송합니다 ( 'wwebclient', jsondata); // 서버 socket.on에서 데이터를 수신합니다 ( 'pushtowebclient', function (data) {// sth.});node.js 서버 코드 :
var http = require ( 'http'), app = http.createserver (). listen ( '8181'), io = require ( 'socket.io'). 듣기 (app); io.sockets.on ( 'Connection', function (socketio) {// 클라이언트 socketio.on ( 'fromwebclient', function (webclientData) {// do sth.}); // 클라이언트 Distroncnect Socketio.on ( 'disconnect', function ', console.log ('clients '); // send}); Socketio.emit ( 'Pushtowebclient', Jsondata);클라이언트와 node.js 서버 간의 잘 연결되는 것은 첫 번째 단계 일뿐입니다. 다음은 Node.js 서버와 Java 비즈니스 로직 계층간에 연결을 설정해야합니다. 현재 Node.js Server는 TMCAT에 TCP 연결 요청을 보내는 클라이언트 역할을합니다. 연결이 성공한 후 Node.js 서버와 Tomcat은 전체 이중 채널을 설정하며 유일한 채널입니다. 클라이언트 요청 수가 많든 Node.js 서버에서 Tomcat으로 전달됩니다. 마찬가지로 Tomcat이 푸시하는 데이터도 Node.js 서버를 통해 각 클라이언트에 배포됩니다.
여기에는 문제가 있습니다. 즉, WebSocket 연결과 소켓 연결이 설정된 후 두 연결이 차단됩니다. Tomcat은 어떤 WebSocket 연결이 데이터를 보냈는지 모르고 어떤 클라이언트가 데이터를 보냈는지 알지 못합니다. 물론 Node.js는 세션 ID를 사용하여 Tomcat으로 보내기 위해 어떤 클라이언트인지 식별 할 수 있지만이 기사는 다른 방법을 사용합니다.
클라이언트가 Node.js와 WebSocket 연결을 설정하면 각 연결에는 인스턴스가 포함되어 있으며 여기에서 Socketio라고합니다. 각 socketio에는이 연결을 고유하게 식별하기위한 ID 속성이 있으며 여기에서 socket_id라고합니다. Socket_id를 사용하여 Node.js 서버에 매핑 테이블이 설정되어 각 Socketio와 Socket_id 간의 매핑 관계를 저장합니다. Node.js 서버가 Tomcat에 데이터를 보내면 Socket_id가 가져 오면 Java 부분이 일련의 처리를 수행 한 다음 각 클라이언트가 요구하는 다른 데이터를 캡슐화하고 반환합니다. 반환 된 데이터는 Socket_id와 해당 관계를 가져야합니다. 이러한 방식으로, Node.js 서버가 Tomcat이 전송하는 데이터를 수신 할 때, 위에서 언급 한 매핑 테이블을 통해 다른 Socketio에 의해 다른 클라이언트에 배포됩니다.
node.js 서버 코드 :
var http = require ( 'http'), net = require ( 'net'), app = http.createserver (). listen ( '8181'), io = require ( 'socket.io'). listen (app), nodeserver = new net.socket (); // tomcat nodeserver.connect (8007, '127.0.0.1', function () {console.log ( 'Connected');}); // 클라이언트의 WebSocket 연결 인스턴스를 저장 var asocket = {}; // 클라이언트 io.sockets.on ( 'Connection', function (socketio) {// 클라이언트로부터 데이터를 수신하고 tomcat socketio.on ( 'fromWebClient', function (webclientData) {// 매핑 테이블 [socketio.id] = socketio; // socket_id를 tomcat webcattata에 추가로 첨가합니다. socketio.id; // 문자열 유형을 tomcat nodeserver.write (json.stringify (webclientData)); }); // tomcat nodeserver.on ( 'data', function (data) {var jsondata = json.parse (data.toString ()); // (var i in jsondata.list) {asocket [jsondata.list [ 'sid']]. emit ( 'pushtowebclient', jsondata.) }});위의 코드는 Tomcat에서 Node.js 서버가 수신 한 데이터와 같은 일부 논리를 생략합니다. Tomcat의 데이터는 두 가지 유형으로 나뉩니다. 하나는 데이터가 푸시되고 다른 하나는 요청에 응답하는 데이터입니다. 여기서 푸시 된 데이터는 균일하게 처리됩니다.
통신을 처리 할 때 Node.js에 의해 Tomcat으로 전송 된 데이터는 문자열 형식이며 Tomcat에서 수신 된 데이터는 버퍼 객체 (8 바이트)이며 String으로 변환 한 다음 JSON으로 변환하고 클라이언트로 전송해야합니다.
이 기사는 이러한 두 가지 연결의 간단한 예를 제공하며 특정 비즈니스에 많은 것들을 추가해야합니다. Node.js가 프로젝트에 도입되었으므로 프론트 엔드는 처리, 캐싱 및 많은 비즈니스 논리를 추가하는 것과 같은 더 많은 것을 수행해야합니다.