Heim > Web-Frontend > js-Tutorial > Hauptteil

Node.js implementiert Daten push_node.js?1.1.2

PHP中文网
Freigeben: 2016-05-16 15:05:33
Original
1750 Leute haben es durchsucht

Szenario: Die Back-End-Update-Daten werden an den Client übertragen (der Java-Teil verwendet den Tomcat-Server).

Es gibt viele Lösungen für Back-End-Push-Daten, wie zum Beispiel Polling, Comet und WebSocket.

1. Polling hat die niedrigsten Entwicklungskosten für das Backend, das darin besteht, Ajax-Anfragen auf traditionelle Weise zu verarbeiten und Daten zurückzugeben. Als ich in der Schule war, wurde in den Laborprojekten immer Polling verwendet, weil es am sichersten ist und zuverlässigste Methode. Die durch Abfragen verursachte Verschwendung von Kommunikationsressourcen kann jedoch nicht ignoriert werden. Unabhängig davon, ob sich die Daten ändern oder nicht, wird die Anfrage wie gewohnt gesendet und beantwortet, und jede HTTP-Anfrage enthält lange Header-Informationen.

2. Das Konzept von Comet ist eine lange Verbindung. Nachdem der Client eine Anfrage gesendet hat, hält das Backend die Verbindung aufrecht, bis die Verbindung abläuft oder das Backend Daten zurückgibt, und stellt dann die Verbindung wieder her Kommunikationsressourcen zum Server werden tatsächlich verbraucht.

3. WebSocket ist eine von HTML5 bereitgestellte Vollduplex-Kommunikationstechnologie, die eine gute Echtzeitleistung aufweist und derzeit einen kleineren Header unterstützt Die Browser lauten wie folgt:

Node.js implementiert Daten push_node.js?1.1.2

Die ideale Situation besteht darin, die Kombination aus WebSocket und Comet zu verwenden und die Comet-Methode für Browser wie IE8 zu verwenden, um die Downgrade-Verarbeitung durchzuführen. Auf diese Weise muss das Backend jedoch zwei Logiken zur Verarbeitung von Anforderungen implementieren, nämlich WebSocket und Comet. Daher wird in diesem Artikel Node.js hinzugefügt. Der Grund dafür besteht darin, die Logik der Verarbeitung von WebSocket (oder Comet) auf den Node.js-Teil zu übertragen, um keine „Probleme“ im Backend zu verursachen, da dies in tatsächlichen Situationen der Fall ist Die Front-End-Entwickler drängen Es ist nicht einfach, ein Endbenutzer-Entwickler zu sein. Node.js dient als mittlere Schicht für die Kommunikation zwischen dem Browser und der Java-Geschäftslogikschicht, verbindet den Client und Tomcat und kommuniziert mit Tomcat über Socket (es ist Socket, nicht WebSocket, und das Backend muss die Socket-Schnittstelle implementieren).

Im Client werden WebSocket und Comet über Socket.io implementiert und wählen die entsprechende Implementierungsmethode (WebSocket, Long Pull ...) für verschiedene Browserversionen oder verschiedene Clients aus Die Einführung von Socket.io ermöglicht die Verarbeitung von WebSocket (oder Long-Pull-Verbindungen). .js-Servercode:

<script src="static/js/socket.io.js"></script>
Nach dem Login kopieren


Herstellen einer Verbindung zwischen Der Client und der Node.js-Server sind nur der erste Schritt. Als Nächstes müssen Sie den Node.js-Server und die Java-Geschäftsverbindung herstellen. Zu diesem Zeitpunkt fungiert der Node.js-Server als Client und sendet eine TCP-Verbindung Nach erfolgreicher Verbindung richten der Node.js-Server und Tomcat einen Vollduplex-Kanal ein, und dies ist der einzige, der die Daten vom Node.js-Server weiterleitet Push von Tomcat wird auch über den Node.js-Server an jeden Client verteilt.

var socket = io.connect(&#39;127.0.0.1:8181&#39;);
 // 发送数据至服务器
socket.emit(&#39;fromWebClient&#39;, jsonData);
// 从服务器接收数据
 socket.on(&#39;pushToWebClient&#39;, function (data) {
  // do sth.
 });
Nach dem Login kopieren
Hier liegt ein Problem vor, das heißt, nachdem die WebSocket-Verbindung und die Socket-Verbindung hergestellt wurden, werden die beiden Verbindungen voneinander blockiert . Tomcat weiß nicht, welche WebSocket-Verbindung die Daten gesendet hat. Natürlich kann Node.js die an Tomcat gesendete Sitzungs-ID verwenden, aber dieser Artikel verwendet eine andere Methode.

Wenn der Client eine WebSocket-Verbindung mit Node.js herstellt, wird diese als socketIO bezeichnet. Hier ist sie namens socket_id. Verwenden Sie socket_id, um eine Zuordnungstabelle auf dem Node.js-Server zu erstellen, um die Zuordnungsbeziehung zwischen jedem socketIO und socket_id zu speichern. Der Node.js-Server bringt diese socket_id, wenn er Daten an Tomcat sendet, und führt dann eine Reihe von Aktionen aus verarbeitet und kapselt dann die von jedem Client benötigten unterschiedlichen Daten und gibt sie zurück. Die zurückgegebenen Daten müssen eine entsprechende Beziehung zur socket_id haben. Wenn der Node.js-Server die von Tomcat gesendeten Daten empfängt, werden sie über verschiedene socketIOs an verschiedene Clients verteilt durch die zuvor erwähnte Zuordnungstabelle.
var http = require(&#39;http&#39;),
  app = http.createServer().listen(&#39;8181&#39;),
  io = require(&#39;socket.io&#39;).listen(app);
io.sockets.on(&#39;connection&#39;, function (socketIO) {
  // 从客户端接收数据
  socketIO.on(&#39;fromWebClient&#39;, function (webClientData) {
    // do sth.
  });
  // 客户端断开连接
  socketIO.on(&#39;disconnect&#39;, function () {
    console.log(&#39;DISCONNECTED FROM CLIENT&#39;);
  });    
  // 向客户端发送数据
  socketIO.emit(&#39;pushToWebClient&#39;, jsonData);  
});
Nach dem Login kopieren

Node.js-Servercode:

Der obige Code lässt einige Logik weg, z. B. was der Node.js-Server empfängt Tomcat Es gibt zwei Arten von Daten: Die einen sind die gepushten Daten und die anderen sind die Daten als Antwort auf die Anfrage. Die gepushten Daten werden hier einheitlich verarbeitet.

Bei der Verarbeitung der Kommunikation liegen die von Node.js an Tomcat gesendeten Daten im String-Format vor, während die von Tomcat empfangenen Daten im Pufferobjekt (oktal) vorliegen, das in String und dann in JSON konvertiert werden muss an den Kunden senden.

var http = require(&#39;http&#39;),
   net = require(&#39;net&#39;),
   app = http.createServer().listen(&#39;8181&#39;),
   io = require(&#39;socket.io&#39;).listen(app),
   nodeServer = new net.Socket();
 // 连接到Tomcat
 nodeServer.connect(8007, &#39;127.0.0.1&#39;, function() {
   console.log(&#39;CONNECTED&#39;);
 });
// 存储客户端的WebSocket连接实例
 var aSocket = {};
 // 同客户端建立连接
 io.sockets.on(&#39;connection&#39;, function (socketIO) {
  // 从客户端接收数据,然后发送至Tomcat
   socketIO.on(&#39;fromWebClient&#39;, function (webClientData) {    
    // 存储至映射表
     aSocket[socketIO.id] = socketIO;
    // 发送至Tomcat的数据中添加socket_id
    webClientData[&#39;sid&#39;] = socketIO.id;    
    // 发送String类型的数据至Tomcat
    nodeServer.write(JSON.stringify(webClientData));    
   });
   // 客户端断开连接
   socketIO.on(&#39;disconnect&#39;, function () {
    console.log(&#39;DISCONNECTED FROM CLIENT&#39;);
   });  
});
 // 从Tomcat接收数据
 nodeServer.on(&#39;data&#39;, function (data) { 
   var jsonData = JSON.parse(data.toString());  
   // 分发数据至客户端
   for (var i in jsonData.list) {
     aSocket[jsonData.list[i][&#39;sid&#39;]].emit(&#39;pushToWebClient&#39;, jsonData.list[i].data);
  }
 });
Nach dem Login kopieren
Dieser Artikel gibt nur ein einfaches Beispiel für zwei solcher Zusammenhänge. Viele Dinge müssen zum spezifischen Geschäft hinzugefügt werden. Da Node.js in das Projekt eingeführt wurde, muss das Front-End mehr Aufgaben übernehmen, wie z. B. Datenverarbeitung, Caching und sogar das Hinzufügen einer Menge Geschäftslogik.

Das Obige ist der Inhalt der Node.js-Daten push_node.js?1.1.2 Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (m.sbmmt.com)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!