ホームページ >ウェブフロントエンド >jsチュートリアル >NodeJS TCPモジュールネットインスタンスの詳細説明

NodeJS TCPモジュールネットインスタンスの詳細説明

零下一度
零下一度オリジナル
2017-06-26 11:51:021823ブラウズ

前の言葉

TCP サービスはネットワーク アプリケーションで非常に一般的であり、現在のアプリケーションのほとんどは TCP に基づいて構築されています。 net モジュールは、サーバーとクライアントを作成するためのメソッドを含む、TCP ネットワーク プログラミング用の非同期ネットワーク ラッパーを提供します。この記事ではnodeJSのnetモジュールについて詳しく紹介します

IPテスト

【net.isIP(input)】

入力がIPアドレスかどうかをテストします。文字列が無効な場合は 0 を返します。 IPV4の場合は4を返し、IPV6の場合は6を返す

var net = require('net');
console.log(net.isIP('1.1.1.1'));//4console.log(net.isIP('1.1'));//0console.log(net.isIP('AD80::ABAA:0000:00C2:0002'));//6

【net.isIPv4(input)】

入力アドレスがIPV4の場合はtrueを返し、そうでない場合はfalseを返す

var net = require('net');
console.log(net.isIPv4('1.1.1.1'));//trueconsole.log(net.isIPv4('1.1'));//false

【net.isIPv6 (input) )]

入力されたアドレスがIPV6の場合はtrueを返し、それ以外の場合はfalseを返します

var net = require('net');
console.log(net.isIPv6('1.1.1.1'));//trueconsole.log(net.isIPv6('AD80::ABAA:0000:00C2:0002'));//true

Server

【net.createServer([options][, connectionListener])】

Create a TCPサーバー、パラメータは以下の通りです

options
    allowHalfOpen: false(默认),如果为true,当另一端socket发送FIN包时socket不会自动发送FIN包。socket变为不可读但可写(半关闭)
    pauseOnConnect: false(默认),如果为true,当连接到来的时候相关联的socket将会暂停。它允许在初始进程不读取数据情况下,让连接在进程间传递。调用resume()从暂停的socket里读取数据
connectionListener 自动给 'connection' 事件创建监听器
var server = net.createServer(function() {

});

【server.listen(port[, host][, backlog][, callback])】

指定したポートportとhostからの接続の受け付けを開始します。 host が省略された場合、サーバーは任意の IPv4 アドレス (INADDR_ANY) からの直接接続を受け入れます。ポートが 0 の場合、バックログは接続待機キューの最大長になります。実際の長さは、Linux の tcp_max_syn_backlog や somaxconn など、sysctl を介してオペレーティング システムによって設定されます。このパラメータのデフォルト値は 511 です

サーバーがバインドされると「listening」イベントがトリガーされます。最後のパラメーターのコールバックは、「listening」イベントのリスナーとして使用されます

一部のユーザーは、要求されたポートで別のサーバーがすでに実行されていることを示す EADDRINUSE エラーに遭遇することがあります。この状況に対処する方法は、しばらく待ってから再試行することです

server.listen(6000);
[server.close([callback])]

サーバーは新しい接続の受信を停止し、既存の接続を維持します。すべての接続が完了すると、サーバーが閉じられ、「close」イベントがトリガーされます。 「close」イベントをリッスンするコールバック関数を渡すことができます。存在する場合、コールバック関数は、エラー (存在する場合) を唯一のパラメータとして呼び出されます

[server.address()]

オペレーティング システムは、バインドされたアドレス、プロトコル ファミリ名、およびサーバー ポートを返します。どのポートがシステムによってバインドされているかを調べるときに非常に便利です

[注意] 'listening' イベントがトリガーされる前にserver.address()を呼び出さないでください

server.listen(function() {//{ address: '::', family: 'IPv6', port: 53806 }    console.log(server.address());
});
【server.maxConnections】

このオプションを設定した後、 when サーバー接続数がその数を超えた場合に新しい接続を拒否します

child_process.fork()メソッドを使用して子プロセスにソケットを送信した後は、このオプションは推奨されません

【server.getConnections(callback)】

サーバーの現在のアクティブステータス、接続数を非同期で取得します。ソケットが子プロセスに送信される場合にのみ有効です。

コールバック関数にはerrとcountの2つのパラメータがあります

server.getConnections(function(err,count){
    console.log(count);//0})
【イベントリスニング】

サーバーがserver.listenバインディングを呼び出すとトリガーされます

【イベント接続】

{Socket object} 连接对象
新しい接続が作成されたときにトリガーされます。 Socket は net.Socket のインスタンスです

【イベントクローズ】

サーバーが閉じられるとトリガーされます

【注意】接続がある場合、すべての接続が閉じられるまでこのイベントはトリガーされません

【イベント】 error】

エラー発生時 トリガー

client

【net.connect(options[, connectionListener])】

【net.createConnection(options[, connectionListener])】

connect()のエイリアスはcreateConnection()メソッドです

メソッドは指定されたアドレスとポートに接続された新しい「net.Socket」を返します。ソケットが確立されると、「connect」イベントがトリガーされます。 「net.Socket」と同じメソッドです

TCPソケットの場合、パラメータのオプションは次のとおりです

port: 客户端连接到 Port 的端口(必须)
host: 客户端要连接到得主机。默认 'localhost'localAddress: 网络连接绑定的本地接口
localPort: 网络连接绑定的本地端口
family : IP 栈版本。默认 4
ローカルドメインのソケットの場合、パラメータのオプションは次のとおりです

path: 客户端连接到得路径(必须)
var client = net.connect({port: 5000}, function() {});

Socket

【new net.Socket ([options])】

新しいソケットオブジェクトを構築します

optionsオブジェクトには以下のデフォルト値があります:

{ fd: null
  allowHalfOpen: false,
  readable: false,
  writable: false}

  参数fd允许指定一个存在的文件描述符。将readable和(或)writable设为true,允许在这个socket上读或写(仅在参数fd有效时)

【socket.connect(port[, host][, connectListener])】

【socket.connect(path[, connectListener])】

  使用传入的socket打开一个连接。如果指定了端口port和主机host,TCP socket将打开socket。如果忽略参数host,则默认为localhost。如果指定了path,socket将会被指定路径的unix socket 打开

  参数 connectListener 将会作为监听器添加到 'connect' 事件

【socket.write(data[, encoding][, callback])】

  在socket上发送数据。第二个参数指定了字符串的编码,默认是UTF8编码

  如果所有数据成功刷新到内核缓冲区,返回true。如果数据全部或部分在用户内存里,返回false。当缓冲区为空的时候会触发'drain'

  当数据最终被完整写入的的时候,可选的callback参数会被执行,但不一定会马上执行

【socket.end([data][, encoding])】

  半关闭socket。例如,它发送一个FIN包。可能服务器仍在发送数据。

  如果参数data不为空,等同于调用socket.write(data,encoding)后再调用socket.end()

【socket.destroy()】

  确保没有 I/O 活动在这个套接字上。只有在错误发生情况下才需要

【socket.pause()】

  暂停读取数据。就是说,不会再触发 data 事件。对于控制上传非常有用

【socket.resume()】

  调用 pause() 后想恢复读取数据

【socket.setTimeout(timeout[, callback])】

  socket 闲置时间超过 timeout 毫秒后 ,将 socket 设置为超时。触发空闲超时事件时,socket 将会收到 'timeout'事件,但是连接不会被断开。用户必须手动调用 end() 或 destroy() 这个socket。

  如果 timeout = 0, 那么现有的闲置超时会被禁用。可选的 callback 参数将会被添加成为 'timeout' 事件的一次性监听器

【socket.setNoDelay([noDelay])】

  禁用纳格(Nagle)算法。默认情况下 TCP 连接使用纳格算法,在发送前他们会缓冲数据。将 noDelay 设置为 true 将会在调用 socket.write() 时立即发送数据。noDelay 默认值为 true

【socket.setKeepAlive([enable][, initialDelay])】

  禁用/启用长连接功能,在发送第一个在闲置socket上的长连接probe之前,可选地设定初始延时。默认false

  设定initialDelay(毫秒),来设定收到的最后一个数据包和第一个长连接probe之间的延时。将 initialDelay 设为0,将会保留默认(或者之前)的值。默认值为0

【socket.address()】

  操作系统返回绑定的地址,协议族名和服务器端口。返回的对象有 3 个属性,比如{ port: 12346, family: 'IPv4', address: '127.0.0.1' }

【socket.remoteAddress】

  远程的 IP 地址字符串

【socket.remoteFamily】

  远程IP协议族字符串

【socket.remotePort】

  远程端口,数字表示

【socket.localAddress】

  远程客户端正在连接的本地IP地址,字符串表示

【socket.localPort】

  本地端口地址,数字表示

【socket.bytesRead】

  接收的字节数

【socket.bytesWritten】

  发送的字节数

【事件lookup】

  在解析域名后,但在连接前,触发这个事件。对 UNIX sokcet 不适用

err {Error | Null} 错误对象
address {String} IP 地址。
family {String | Null} 地址类型

【事件connect】

  当成功建立 socket 连接时触发、

【事件data】

{Buffer object}

  当接收到数据时触发。参数 data 可以是 Buffer 或 String

  当 Socket 触发一个 'data' 事件时,如果没有监听器,数据将会丢失

【事件end】

  当 socket 另一端发送 FIN 包时,触发该事件

【事件timeout】

  当 socket 空闲超时时触发,仅是表明 socket 已经空闲。用户必须手动关闭连接

【事件drain】

  当写缓存为空得时候触发。可用来控制上传

【事件error】

  错误发生时触发

【事件close】

had_error {Boolean} 如果 socket 传输错误,为 true

  当 socket 完全关闭时触发。参数 had_error 是 boolean,它表示是否因为传输错误导致 socket 关闭

 

简易服务器

【服务器】

//server.jsvar net = require('net') ;var server = net.createServer(function(socket) { 
    socket.write("Hi!\n");
    socket.on("data", function(data) {
      console.log(data.toString());
    });
    socket.on("end", function() {
      console.log('有客户机下线了!!!');
    });
    socket.on('error', function() {
      console.log('发生意外错误!!!');
    });
}) ;
server.listen(8080) ;

【客户机】

//client.jsvar net = require('net') ;var client = net.connect({port: 8080},function(){
    client.name = '客户机1';
    client.write(client.name + ' 上线了!\n');
    client.end(client.name + ' 下线了!\n');
    client.on("data", function(data) {
        console.log(data.toString());
    });
});

 

简易聊天室

【服务器】

//chatServer.jsvar net = require('net');var i = 0;//保存客户机var clientList = [];var server = net.createServer(function(socket) {
    socket.name = '用户' + (++i);
    socket.write('【聊天室提示】欢迎' + socket.name + '\n');//更新客户机数组    clientList.push(socket); function showClients(){
        console.log('【当前在线用户】:');for(var i=0;i<clientList.length;i++) { 
            console.log(clientList[i].name);
        }        
    }
    showClients();
    socket.on("data", function(data) {//把当前连接的客户机的信息转发到其他客户机  for(var i=0;i<clientList.length;i++) { if(socket !== clientList[i]) {      
                clientList[i].write('【' + socket.name + '】:' + data);   
            }  
        }
    });
    socket.on("close", function() {//当前客户机下线时,将其从客户机数组中移除clientList.splice(clientList.indexOf(socket), 1);
        showClients();
    });
    socket.on('error', function(err) {
        console.log(socket.name + '退出');
    });
});
server.listen(8080) ;

【客户机】

//chatClient.jsvar net = require('net');
process.stdin.resume();
process.stdin.setEncoding('utf8');var client = net.connect({port: 8080},function(){
    console.log('【本机提示】登录到聊天室');
    process.stdin.on('data',function(data){
        client.write(data);
    })
    client.on("data", function(data) {
        console.log(data.toString());
    });
    client.on('end', function() {
        console.log('【本机提示】退出聊天室');
        process.exit();
    });
    client.on('error', function() {
        console.log('【本机提示】聊天室异常');
        process.exit();
    });
});

 

以上がNodeJS TCPモジュールネットインスタンスの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。