前書きおそらく、Node.js を最もよく使用するのは、http サービスを作成することです。そのため、すべての Web 開発エンジニアにとって、Node.js のネットワーク関連モジュールを学習することは不可欠です。
Node.js ネットワーク モジュール アーキテクチャ
Node.js モジュールには、Net、DNS、HTTP、TLS/SSL、HTTPS、UDP/Datagram などのネットワーク関連モジュールが含まれます。さらに、v8 の基礎となる関連モジュールもあります。ネットワーク モジュールには tcp_wrap が含まれます。 .cc、udp_wrap.cc、pipe_wrap.cc、stream_wrap.cc など。JavaScript 層と C++ 層は、process.binding を通じて相互に通信します。
Net モジュールNet モジュールは、サーバーとクライアントの作成を含む、いくつかの基盤となるネットワーク通信インターフェイスを提供します。また、HTTP モジュールは、Net モデルに基づいた上位層のカプセル化でもあります。Net モジュールは、主に net.Server と net を提供します。 .Socket
TCP サーバーの作成 TCP サーバーを作成するには、コンストラクター new net.Server またはファクトリ メソッド net.createServer を使用できます。どちらのメソッドも 2 つの Select パラメーターを受け取ることができる net.Server クラスを返します。
var net = require('net'); var server = net.createServer(function(socket){
socket .on('data',function(data){
console.log('socket data',data.toString());
socket.write( data.toString() ); }) .on('end',function(){
console.log('socket end') }) .on('error',function(error){
console.log('socket error',error); });});
server.listen(56200,function(){
console.log('server run at ',server.address());});
server.on('error',function(err){ throw err;});// 执行后:server run at { address: '::', family: 'IPv6', port: 56200 }
リッスン時に指定ポートがない場合は、TCPサーバー作成後、tenlent 0.0.0.0 56200を使用して、自動的に任意のポートをリッスンします。接続後、サーバーとのデータ通信が可能です。 createServer を通じてサービスをインスタンス化した後、サービスはクライアントのリクエストをリッスンし、クライアントとのリンクを確立した後、リンク構築用の net.Socket オブジェクトがコールバックにスローされます。
TCP クライアントの作成 TCP クライアント リンクを作成するには、コンストラクター new net.Socket またはそのファクトリ メソッド net.createConnection を使用できます。作成が成功すると、net.Socket インスタンスが返されます。
var net = require('net'); var client = net.createConnection({port:56200,host:'localhost'});
client.on('connect',function(){
console.log('client connect');});
client.on('data',function(data){
console.log('client data',toString());});
client.on('error',function(error){ throw error;});
client.on('close',function(){
console.log('client close');});
ソケット ここでは、ソケットが何であるかについては詳しく説明しません。主に net.Socket 構造が提供するメソッドとイベント監視の使用方法を理解しましょう。
関連イベントconnect: クライアントがサーバーとのリンクを正常に確立するとトリガーされ、リンクが失敗した場合、サーバーはエラー イベントを直接スローし、ノード プロセスを終了します。
data: クライアントがサーバーから送信されたデータ、またはクライアントからサーバーに送信されたデータを受信すると、コールバックがトリガーされます。
end: 相手側が FIN パケットを送信し、切断されたときにトリガーされます。デフォルト (allowHalfOpen == false) では、ソケットは自己破壊されます (保留キューに書き込まれ、戻りパケットが正式に応答されなかった場合)。ただし、allowHalfOpen パラメータを true に設定すると、ソケットへのデータの書き込みを続行できますが、ソケットを消費するには終了メソッドを自分で呼び出す必要があります。そうしないと、ハンドル リークが発生する可能性があります。
close: リンクが切断されたときにトリガーされますが、送信プロセス中にエラーが発生した場合は、コールバック関数でエラーがスローされます。
timeout: ソケットがタイムアウトしてアイドル状態になったときにトリガーされ、キュー内でソケットを破棄したい場合は、手動で close メソッドを呼び出す必要があります。
lookup: ドメイン名解決が完了するとトリガーされます。
drain: キャッシュが書き込まれるときにトリガーされ、アップロード サイズを制限するために使用できます。
関連メソッドwrite(): サーバーがクライアントにデータを送信するか、クライアントがサーバーにデータを送信します。
address(): サービスにバインドされたソケットの IP アドレスを取得します。返されるオブジェクトには、ポート、ホスト、
、IPvX バージョンという 3 つの属性があります。
end(): ソケットを半分閉じても、FIN パケットが送信されます。次のように、socket.end(data,encoding) を呼び出すこともできます。
pause(): データの読み取りを一時停止し、データのアップロードを制限するために使用できます。
resume(): データの読み取りを続行します。
setEncoding(): データストリームの取得形式を設定します。
setKeepAlive(): キープアライブ機能を許可/無効にします。
setNoDelay(): Nagle アルゴリズムを無効にします。TCP リンクはデフォルトで Nagle アルゴリズムを使用し、データは送信前にキャッシュされます。これが true の場合、socket.write() が呼び出されるたびにデータがすぐに送信されます。デフォルトは true です。
setTimeout(): アイドル状態のソケットが数秒間非アクティブになると、タイムアウト イベントを受け取りますが、ソケットの破棄は停止しないため、end() または destroy() を手動で呼び出す必要があります。アイドルタイムアウトが禁止されていることを示します。
関連属性bufferSize: 現在バッファリングされ、送信を待機している文字列の数。
bytesRead : 受信したバイト数。
bytesWritten: 送信されたバイト数
destroyed: リンクが切断されると、データの送信にそのリンクを使用する必要がないかどうかを識別します。
localAddress: リモート クライアントがローカル アドレスに接続するホスト。リスニング サービスのホストが 0.0.0.0 で、クライアント接続が '192.168.1.1' の場合、最終的な値は後者になります。
localPort: ローカルポート。
remoteAddress: クライアント IP。ソケットが破壊された場合、値は未定義です。
remoteFamily: クライアントはIPvX
パケットリターン例外処理サーバーはクライアントから処理が必要なデータを受信した後、処理リンクに入ります。ビジネスロジックの処理が完了する前にソケットが切断された場合、サーバーは処理リンクに入ります。クライアントにレポートを返すと、エラー イベントに直接応答し、エラー: このソケットは他の部分によって終了されたため、レポートする前に、ソケットが破棄されていないかどうかをサーバーが判断する必要があります。切断されている場合はパケットが返されます:
var net = require('net');var biz = require('./biz');var server = net.createServer(function(socket){
socket .on('data',function(data){
biz.do(data) .then(function(){ if( !socket.destroyed ) {
socket.write( data.toString() ); } else { // do some report
socket.destry(); } }) .catch(function(){ !socket.destroyed && socket.end('server handler error'); });
}) .on('end',function(){
console.log('socket end') }) .on('error',function(error){
console.log('socket error',error); });});
server.listen(56200,function(){
console.log('server run at ',server.address());});server.on('error',function(err){ throw err;});
クライアントのデータサイズを制限します。对请求大小限制是服务安全里面比不可少的一个环节,服务端不能无限大小的去接受客户端发送过来的所有数据,而限制大小就是第一道门槛。
var net = require('net');var MAX_REQUEST_BYTES = 2 * 1024 * 1024; // 2Mvar server = net.createServer(function(socket){
socket .on('data',function(data){
if(data.bytesRead > MAX_REQUEST_BYTES) {
socket.pause();
socket.end('data is too big, forbidden'); // do some report } }) .on('end',function(){
console.log('socket end') }) .on('error',function(error){
console.log('socket error',error); });});
server.listen(56200,function(){
console.log('server run at ',server.address());});
server.on('error',function(err){ throw err;});
以上がNode.jsでのネットワーク通信モジュールの実装方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。