>  기사  >  웹 프론트엔드  >  Nodejs 고급 핵심 모듈 순 입문 학습 및 예제 설명

Nodejs 고급 핵심 모듈 순 입문 학습 및 예제 설명

高洛峰
高洛峰원래의
2016-12-06 11:49:331048검색

모듈 개요

net 모듈은 nodejs의 핵심 모듈이기도 합니다. http 모듈 개요에서 언급했듯이 http.Server는 net.Server를 상속합니다. 또한 http 클라이언트와 http 서버 간의 통신은 소켓(net.Socket)에 의존합니다. 즉, 노드 서버 프로그래밍을 할 때 net은 기본적으로 빼놓을 수 없는 모듈이다.

구성적인 관점에서 net 모듈은 크게 두 부분으로 구성됩니다. 소켓 프로그래밍을 아는 학생이라면 익숙할 것입니다.

net.Server: 네트워크와 통신하는 TCP 서버입니다. 소켓을 통해 내부적으로 클라이언트.

net.Socket: 전이중 스트림 인터페이스를 구현하는 tcp/local 소켓의 노드 버전 구현입니다.

이 기사는 독자에게 개요를 제공하기 위한 간단한 TCP 서버/클라이언트 예제로 시작됩니다. 그런 다음 net.Server 및 net.Socket의 더 중요한 API, 속성 및 이벤트를 각각 소개합니다.

초보자의 경우 기사에 포함된 예제를 로컬에서 실행하여 이해를 심화하는 것이 좋습니다.

간단한 서버+클라이언트 예시

tcp 서버 프로그램은 다음과 같습니다.

var net = require('net');
 
var PORT = 3000;
var HOST = '127.0.0.1';
 
// tcp服务端
var server = net.createServer(function(socket){
  console.log('服务端:收到来自客户端的请求');
 
  socket.on('data', function(data){
    console.log('服务端:收到客户端数据,内容为{'+ data +'}');
 
    // 给客户端返回数据
    socket.write('你好,我是服务端');
  });
 
  socket.on('close', function(){
     console.log('服务端:客户端连接断开');
  });
});
server.listen(PORT, HOST, function(){
  console.log('服务端:开始监听来自客户端的请求');
});

tcp 클라이언트는 다음과 같습니다.

var net = require('net');
 
var PORT = 3000;
var HOST = '127.0.0.1';
 
// tcp客户端
var client = net.createConnection(PORT, HOST);
 
client.on('connect', function(){
  console.log('客户端:已经与服务端建立连接');
});
 
client.on('data', function(data){
  console.log('客户端:收到服务端数据,内容为{'+ data +'}');
});
 
client.on('close', function(data){
  console.log('客户端:连接断开');
});
 
client.end('你好,我是客户端');

실행 server, 클라이언트 코드, 콘솔 출력은 다음과 같습니다.

서버:

서버: 클라이언트의 요청 수신 대기 시작
서버: 클라이언트에서 요청 수신
서버: 수신된 클라이언트 데이터, 내용은 {안녕하세요, 저는 클라이언트입니다}
서버: 클라이언트 연결 끊김

클라이언트:

클라이언트 클라이언트: 연결이 설정되었습니다. server
클라이언트: 서버로부터 데이터를 받았습니다. 내용은 {안녕하세요, 저는 서버입니다}
클라이언트: 연결이 끊어졌습니다

Service Net.Server

server.address()
는 바인딩된 IP 주소, 포트 등 서버의 주소 정보를 반환합니다.

console.log( server.address() );
// 输出如下 { port: 3000, family: 'IPv4', address: '127.0.0.1' }

server.close(callback])

서버를 닫고 새 클라이언트 요청 수신을 중지합니다. 몇 가지 참고할 사항이 있습니다:

처리 중인 클라이언트 요청의 경우 서버는 공식적으로 종료되기 전에 해당 요청이 처리될 때까지(또는 시간 초과될 때까지 기다립니다).

정상 종료 중에는 콜백이 실행되고 닫기 이벤트가 트리거됩니다.

예외가 종료되면 콜백도 실행되며 해당 오류가 매개변수로 전달됩니다. (예를 들어 server.listen(port)이 호출되기 전에 server.close()가 호출됩니다.)

다음은 두 가지 구체적인 예를 비교하고 결론을 먼저 나열합니다

server. Listen()이 호출되었습니다. 정상 종료, 닫기 이벤트가 트리거된 다음 콜백이 실행됩니다. 오류 매개변수가 정의되지 않았습니다.

server.listen()이 호출되지 않았습니다. 비정상적인 종료, 닫기 이벤트가 발생했습니다. 트리거된 후 콜백이 실행되면 error는 특정 오류 메시지입니다. (오류 이벤트는 발생하지 않습니다.)

예 1: 서버가 정상적으로 종료되었습니다

var net = require('net');
var PORT = 3000;
var HOST = '127.0.0.1';
var noop = function(){};
 
// tcp服务端
var server = net.createServer(noop);
 
server.listen(PORT, HOST, function(){
 
  server.close(function(error){
    if(error){
      console.log( 'close回调:服务端异常:' + error.message );
    }else{
      console.log( 'close回调:服务端正常关闭' );
    }      
  }); 
});
 
server.on('close', function(){
  console.log( 'close事件:服务端关闭' );
});
 
server.on('error', function(error){
  console.log( 'error事件:服务端异常:' + error.message );
});

출력은 다음과 같습니다.

close event: 서버가 종료되었습니다
close callback: 서버가 정상적으로 종료되었습니다

예2: 서버가 비정상적으로 종료되었습니다

코드는 다음과 같습니다

var net = require('net');
var PORT = 3000;
var HOST = '127.0.0.1';
var noop = function(){};
 
// tcp服务端
var server = net.createServer(noop);
 
// 没有正式启动请求监听
// server.listen(PORT, HOST);
 
server.on('close', function(){
  console.log( 'close事件:服务端关闭' );
});
 
server.on('error', function(error){
  console.log( 'error事件:服务端异常:' + error.message );
});
 
server.close(function(error){
  if(error){
    console.log( 'close回调:服务端异常:' + error.message );
  }else{
    console.log( 'close回调:服务端正常关闭' );
  }      
});

출력은 다음과 같습니다.

이벤트 닫기: 서버가 닫혔습니다.
콜백 닫기: 서버 예외: 실행되지 않음

server.ref()/server.unref ()

노드 이벤트 이해 루프 학생들은 주로 이벤트 루프에서 서버를 추가/제거하는 데 사용되는 두 가지 API에 대해 잘 알고 있어야 합니다. 과정.

넷을 공부하는 학생들은 특별히 주의할 필요는 없습니다. 관심이 있다면 직접 실험해 보세요.

이벤트 청취/연결/닫기/오류

listening: server.listen()을 호출하고, 청취 요청이 공식적으로 시작될 때 트리거됩니다.

connection: 새로운 요청이 들어올 때 트리거되며, 매개변수는 요청과 관련된 소켓입니다.

close: 서버가 닫힐 때 트리거됩니다.

오류: 이미 사용 중인 포트를 모니터링하는 등 서비스 오류가 발생할 때 트리거됩니다.

몇 가지 이벤트는 비교적 간단합니다. 연결의 예는 다음과 같습니다.

테스트 결과를 보면 새로운 클라이언트 연결이 발생하면 net.createServer(callback)에 있는 콜백이 호출되고, 연결 이벤트에 등록된 콜백 함수도 호출되는 것을 알 수 있습니다.

실제로 net.createServer(callback)의 콜백도 노드 내부 구현에서 연결 이벤트에 대한 수신 함수로 추가됩니다. 관심이 있으시면 node.js의 소스 코드를 살펴보세요.

var net = require('net');
var PORT = 3000;
var HOST = '127.0.0.1';
var noop = function(){};
 
// tcp服务端
var server = net.createServer(function(socket){
  socket.write('1. connection 触发\n');
});
 
server.on('connection', function(socket){
  socket.end('2. connection 触发\n');
});
 
server.listen(PORT, HOST);

다음 명령을 통해 효과를 테스트합니다.

curl http://127.0.0.1:3000

출력:

1 . 연결 트리거
2. 연결 트리거

Client net.Socket

클라이언트의 예는 기사 시작 부분에 나와 있으며 그 예를 게시하겠습니다. 여기. (참고: 엄밀히 말하면 net.Socket은 클라이언트라고 불러서는 안 됩니다. 여기서 설명하는 것이 편리할 뿐입니다.)

공식 노드 문서를 보면 net.Socket이 net보다 훨씬 더 복잡하다고 느껴집니다. .Server, 그리고 더 많은 다중 API, 이벤트 및 속성이 있습니다. 하지만 실제로 net.Socket과 관련된 API, 이벤트, 속성을 분류해 보면 그다지 복잡하지 않다는 것을 알 수 있습니다.

자세한 내용은 다음 섹션을 참조하세요.

var net = require('net');
 
var PORT = 3000;
var HOST = '127.0.0.1';
 
// tcp客户端
var client = net.createConnection(PORT, HOST);
 
client.on('connect', function(){
  console.log('客户端:已经与服务端建立连接');
});
 
client.on('data', function(data){
  console.log('客户端:收到服务端数据,内容为{'+ data +'}');
});
 
client.on('close', function(data){
  console.log('客户端:连接断开');
});
 
client.end('你好,我是客户端');

API 및 속성 분류

다음은 net.Socket의 API 및 속성을 독자의 이해를 돕기 위해 용도에 따라 대략적으로 분류한 것입니다. 대부분의 API와 속성은 상대적으로 간단합니다. 문서를 읽어보면 그 기능을 알 수 있으므로 여기서는 자세히 설명하지 않겠습니다.

연결 관련

socket.connect(): 다양한 시나리오에서 사용되는 3가지 매개변수가 있습니다.

socket.setTimeout(): 연결 시간 제한을 설정하는 데 사용됩니다.

socket.setKeepAlive(): 긴 연결을 설정하는 데 사용됩니다.

socket.destroy(), 소켓.destroyed: 오류가 발생할 때 소켓을 파괴하여 이 소켓에 다른 IO 작업이 없도록 하는 데 사용됩니다.

데이터 읽기 및 쓰기 관련

socket.write(),socket.end(),socket.pause(),socket.resume(),socket.setEncoding(), 소켓.setNoDelay()

데이터 속성 관련

socket.bufferSize,socket.bytesRead,socket.bytesWritten

이벤트 루프 관련

socket.ref(), 소켓.unref()

주소 관련

socket.address()

socket.remoteAddress,socket.remoteFamily,socket.remotePort

socket.localAddress/socket.localPort

이벤트 소개

data: 상대방의 데이터가 수신될 때 트리거됩니다.

connect: 연결이 설정되면 트리거됩니다.

close: 연결이 끊어지면 트리거됩니다. 전송 오류로 인해 연결이 끊긴 경우 해당 매개변수는 error입니다.

end: 연결의 상대방이 FIN 패킷을 보낼 때 트리거됩니다(독자는 HTTP 연결 해제 방법을 검토할 수 있음). 기본적으로(allowHalfOpen == false) 소켓은 자체 파괴 작업을 완료합니다. 그러나 계속해서 소켓에 데이터를 쓸 수 있도록 AllowHalfOpen을 true로 설정할 수도 있습니다. 물론, 결국에는 직접 소켓.end()

error를 호출해야 합니다. 오류가 발생할 때 트리거되며 매개변수는 error입니다. (공식 문서에서는 기본적으로 한 문장으로 언급하고 있지만, 오류가 너무 많을 수 있다는 점을 고려하면 이해는 됩니다.)

timeout: 소켓이 타임아웃되어 연결을 수동으로 닫아야 한다는 메시지를 사용자에게 표시합니다. .

드레인: 쓰기 캐시가 비어 있을 때 트리거됩니다. (매우 설명적이지는 않습니다. 자세한 내용은 다음 스트림의 소개를 읽을 수 있습니다.)

조회: 도메인 이름 확인이 완료되면 트리거됩니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.