머리말아마 우리가 Node.js를 가장 많이 사용하는 것은 http 서비스를 만드는 것이기 때문에 모든 웹 개발 엔지니어에게는 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.bind를 통해 서로 통신합니다.
Net 모듈Net 모듈은 서버 및 클라이언트 생성을 포함한 일부 기본 네트워크 통신 인터페이스를 제공합니다. HTTP 모듈은 Net 모델을 기반으로 하는 상위 계층 캡슐화이기도 하며 주로 net.Server 및 net을 제공합니다. .Socket
TCP 서버 생성TCP 서버를 생성하려면 new net.Server 생성자 또는 net.createServer 팩토리 메서드를 사용할 수 있습니다. 두 메서드 모두 두 개의 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');});
로그인 후 복사
Socket 여기서는 소켓이 무엇인지 자세히 설명하지 않겠습니다. net.Socket 구조가 주로 제공하는 메서드가 무엇인지, 모니터링 이벤트를 사용하는 방법에 대해 알아보겠습니다.
관련 이벤트connect: 클라이언트가 서버와의 링크를 성공적으로 설정할 때 트리거됩니다. 연결이 실패하면 서버는 직접 오류 이벤트를 발생시키고 노드 프로세스를 종료합니다.
데이터: 클라이언트가 서버에서 전송된 데이터 또는 클라이언트에서 서버로 전송된 데이터를 수신하면 콜백이 트리거됩니다.
end: 상대방이 FIN 패킷을 보내고 연결이 끊어지면 트리거됩니다. 기본적으로(allowHalfOpen == false) 소켓은 자체 파괴됩니다(보류 중인 대기열에 기록되고 반환 패킷이 공식적으로 응답하지 않은 경우). 하지만 AllowHalfOpen을 설정할 수 있습니다. 매개변수가 true이므로 소켓에 데이터를 계속 쓸 수 있지만 소켓을 소비하려면 end 메소드를 직접 호출해야 합니다. 그렇지 않으면 핸들 누출이 발생할 수 있습니다.
close: 링크가 끊어졌을 때 발생하지만 전송 과정에서 오류가 발생하면 콜백 함수에서 오류가 발생합니다.
timeout: 소켓이 시간 초과되어 유휴 상태일 때 트리거됩니다. 대기열에서 소켓을 삭제하려면 close 메서드를 수동으로 호출해야 합니다.
조회: 도메인 이름 확인이 완료되면 트리거됩니다.
드레인: 캐시가 기록될 때 트리거되며 업로드 크기를 제한하는 데 사용할 수 있습니다.
관련 방법write(): 서버가 클라이언트에 데이터를 보내거나 클라이언트가 서버에 데이터를 보냅니다.
address(): 서비스에 바인딩된 소켓의 IP 주소를 가져옵니다. 반환된 개체에는 포트, 호스트,
및 IPvX 버전이라는 세 가지 속성이 있습니다.
end(): 소켓을 절반 닫고 FIN 패킷을 보냅니다. 서버는 여전히 일부 데이터를 보낼 수도 있습니다. 이와 같이 소켓.end(데이터,인코딩)을 호출할 수도 있습니다.
pause(): 데이터 읽기를 일시 중지하고 데이터 업로드를 제한하는 데 사용할 수 있습니다.
resume(): 데이터 읽기를 계속합니다.
setEncoding(): 데이터 스트림의 획득 형식을 설정합니다.
setKeepAlive(): 연결 유지 기능을 허용/비활성화합니다.
setNoDelay(): Nagele 알고리즘을 비활성화합니다. TCP 링크는 기본적으로 Nagle 알고리즘을 사용하며 해당 데이터는 전송하기 전에 캐시됩니다. 이것이 true이면, 소켓.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!