1. 개방 분석
오늘부터 특정 모듈에서 자세히 배우겠습니다. 이 기사는이 시리즈의 세 번째 기사입니다. 처음 두 기사는 주로 이론을 기반으로합니다. 나는 처음 두 기사에 대한 연구에서
나는 또한 nodejs에 대한 기본적인 이해를 가지고 있습니다. 괜찮습니다! ! ! 다리미가 뜨거워지면서 파업하고, 끝까지 Nodejs를 계속 운반합시다. 글쎄, 말도 안되는 말도 안타깝게도 오늘의 주제 "Net Module"으로 직접 이동하십시오. 그렇다면 어떻게 "Net"이 그것을 이해해야합니까?
무엇입니까? ( Net 모듈은 소켓 서버 또는 소켓 클라이언트를 생성하는 데 사용될 수 있습니다. NodeJS 데이터 통신을위한 가장 기본적인 두 모듈은 NET과 HTTP입니다. 전자는 TCP 기반 캡슐화이지만 후자는 본질적으로 TCP 계층이지만, 프레젠테이션 레이어로 간주되는 많은 데이터 캡슐화를 수행했습니다).
여기서 우리는 nodejs "http.js"의 소스 코드를 참조합니다.
httpserver가 Net 클래스를 상속하고 관련 통신 기능을 가지고 있으며 더 많은 데이터 캡슐화를 수행 한 것으로 보는 것은 어렵지 않습니다. 이는보다 고급 표현 계층으로 간주됩니다.
확장 지식 (다음은 "상속"의 소스 코드) :
코드 사본은 다음과 같습니다.
Exports.inherits = function (ctor, superctor) {
ctor.super_ = 슈퍼 컨터;
ctor.prototype = object.create (superctor.prototype, {
생성자 : {
가치 : CTOR,
열거 가능 : 거짓,
쓰기 가능 : 사실,
구성 가능 : true
}
});
};
기능은 상속과 재사용을 실현하는 것입니다.
방금 일반적으로 사용되는 개념이 포함 된 간단한 개요를 제공했습니다. 다음은 대중화 개념에 대한 간단한 소개입니다.
(1) TCP/IP ---------- TPC/IP 프로토콜은 전송 계층 프로토콜로, 주로 네트워크에서 데이터가 전송되는 방식을 해결합니다.
(2), 소켓 ----- 소켓은 TCP/IP 프로토콜 (프로그램 수준)의 캡슐화 및 응용 프로그램입니다.
(3), http ------ http는 응용 프로그램 계층 프로토콜로, 주로 데이터를 랩핑하는 방법을 해결합니다.
(4) The seven-layer network model----------------------------------------------------------------------------------------------------------------------
요약하면 : 소켓은 TCP/IP 프로토콜의 캡슐화입니다. 소켓 자체는 프로토콜이 아니라 호출 인터페이스 (API)입니다.
이것은 생성, 듣기, 연결, 수락, 보내기, 읽기 및 쓰기 등과 같이 우리가 알고있는 가장 기본적인 기능적 인터페이스를 형성합니다.
TCP/IP는 운영 체제의 운영 메커니즘과 마찬가지로 프로토콜 스택 일뿐입니다. 자세히 구현해야하며 외부 작동 인터페이스도 제공합니다.
실제로, 전송 계층의 TCP는 네트워크 계층의 IP 프로토콜을 기반으로하며, 애플리케이션 계층의 HTTP 프로토콜은 전송 계층의 TCP 프로토콜을 기반으로합니다. 소켓 자체는 프로토콜이 아닙니다. 위에서 언급했듯이 TCP 또는 UDP 프로그래밍에 대한 인터페이스 만 제공합니다.
둘째, 경험하십시오
좋아요, 우리는 개념이 있습니다. 예를 들어 봅시다.
1. Server.js를 작성하십시오
코드 사본은 다음과 같습니다.
var net = 요구 사항 ( 'net');
var server = net.createserver (function (c) {// 연결 리스너
Console.log ( "서버 연결");
c.on ( "end", function () {
Console.log ( "서버 연결이 끊어졌습니다");
});
C.Write ( "안녕하세요, BigBear!/r/n");
C.pipe (c);
});
Server.Listen (8124, function () {// 청취자
Console.log ( "서버 바운드");
});
2. client.js를 생성하십시오
코드 사본은 다음과 같습니다.
var net = 요구 사항 ( 'net');
var client = net.connect ({
포트 : 8124
}, function () {// 청취자를 연결합니다
Console.log ( "클라이언트 연결");
client.write ( '안녕하세요, 베이비!/r/n');
});
client.on ( "data", function (data) {
console.log (data.toString ());
client.end ();
});
client.on ( "end", function () {
Console.log ( "클라이언트 연결 끊김");
});
분석하자 :
Server ------ net.createServer TCP 서비스를 만듭니다. 이 서비스는 포트 8124의 바인딩 (Server.Listen)입니다. 서버를 작성한 후 콜백 기능이 나타납니다.
위의 함수를 호출 할 때 매개 변수도 기능이며 다른 방법으로 구성된 파이프 인 소켓을 허용하며 그 기능은 데이터 상호 작용입니다.
고객이 파이프를 맞이해야합니다. 현재 서버에 대한 클라이언트 액세스가 없으면이 소켓은 존재하지 않습니다.
이름에서 알 수 있듯이客户端------net.connect 서버에 연결되어 있습니다. 첫 번째 매개 변수는 객체입니다. 포트 (포트)는 8124로 설정되어 있으며 서버가 듣는 포트입니다. 호스트 매개 변수가 설정되지 않으므로 기본값은 localhost (local)입니다.
서버에서 소켓은 파이프 라인의 한쪽 끝이며 클라이언트 자체는 파이프 라인의 한쪽 끝입니다. 여러 클라이언트가 서버에 연결되면 서버는 여러 소켓을 생성하고 각 소켓은 클라이언트에 해당합니다.
실행 결과 :
3. 사례 소개
(1) 다음 코드는 서버에서 클라이언트로 일원 통신을 완료하기 위해 클라이언트에게 텍스트를 출력하는 서버 일뿐입니다.
코드 사본은 다음과 같습니다.
// sever-> 클라이언트의 단방향 커뮤니케이션
var net = 요구 사항 ( 'net');
var chatserver = net.createserver ();
chatserver.on ( 'Connection', function (client) {
client.write ( 'hi!/n'); // 서버는 클라이언트에 정보를 출력하고 write () 메소드를 사용합니다.
client.write ( 'bye!/n');
client.end (); // 서버가 세션을 종료합니다
});
chatserver.listen (9000);
텔넷 테스트 : Telnet127.0.0.1 : 9000
Telnet을 실행 한 후 서비스 지점에 연결하고 Hi의 캐릭터를 피드백하십시오! Bye!, 즉시 서버 프로그램을 끝내고 연결을 종료하십시오.
서버가 클라이언트에 정보에 연결되기를 원한다면 어떻게해야합니까?
Server.Data 이벤트를 듣고 연결을 중단하지 않을 수 있습니다 (또는 즉시 수락 할 수없는 클라이언트의 메시지를 즉시 종료합니다).
(2), Server.Data 이벤트를 듣고 연결을 중단하지 마십시오 (그렇지 않으면 클라이언트의 메시지는 즉시 수락 할 수 없습니다).
코드 사본은 다음과 같습니다.
// 전자, 구현 클라이언트를 기반으로-> Sever Communication은 양방향 통신입니다.
var net = 요구 사항 ( 'net');
var chatserver = net.createserver (),
ClientList = [];
chatserver.on ( 'Connection', function (client) {
// js는 객체에 속성을 자유롭게 추가 할 수 있습니다. 여기서 우리는 어떤 클라이언트 (클라이언트의 주소 + 포트가
client.name = client.remoteaddress + ':' + client.remoteport;
client.write ( 'hi' + client.name + '!/n');
clientList.push (클라이언트);
client.on ( 'data', function (data) {
브로드 캐스트 (데이터, 클라이언트); // 클라이언트로부터 정보를 수락합니다
});
});
함수 방송 (메시지, 클라이언트) {
for (var i = 0; i <clientList.Length; i+= 1) {
if (client! == clientList [i]) {
clientList [i] .write (client.name + "say" + message);
}
}
}
chatserver.listen (9000);
위의 전체 코드입니까? 우리는 고려되지 않은 또 다른 문제가 있다고 말했습니다. 즉, 클라이언트가 종료되면 클라이언트리스트에 남아 있는데, 이는 분명히 널 포인터입니다.
(3) ClientList를 프로세스하십시오
코드 사본은 다음과 같습니다.
chatserver.on ( 'Connection', function (client) {
client.name = client.remoteaddress + ':' + client.remoteport
client.write ( 'hi' + client.name + '!/n');
ClientList.push (클라이언트)
client.on ( 'data', function (data) {
방송 (데이터, 클라이언트)
})
client.on ( 'end', function () {
clientList.splice (clientList.IndexOf (client), 1); // 배열에서 공식 요소를 삭제합니다.
})
})
NoDETCPAPI는 우리에게 최종 이벤트, 즉 클라이언트가 서버 연결을 중단 할 때 우리에게 제공했습니다.
(4) 방송 최적화
코드 사본은 다음과 같습니다.
함수 방송 (메시지, 클라이언트) {
var 정리 = []
for (var i = 0; i <clientList.Length; i+= 1) {
if (client! == clientList [i]) {
if (clientList [i] .Writable) {// 소켓이 먼저 쓸 수 있는지 확인하십시오
clientList [i] .write (client.name + "say" + message)
} 또 다른 {
cleanup.push (clientList [i]) // 쓰기가 불가능한 경우 수집하여 파괴하십시오. 파괴 전에 Socket.destroy ()는 API에 의해 파괴되어야합니다.
clientList [i] .destroy ()
}
}
} // 쓰기 루프에서 쓰기 루프에서 죽은 노드를 제거합니다.
for (i = 0; i <cleanup.length; i+= 1) {
clientList.splice (clientList.IndexOf (Cleanup [i]), 1)
}
}
일단 "종료"가 트리거되지 않으면 예외가 발생하므로 최적화 작업이 수행됩니다.
(5) Netapi는 또한 클라이언트 예외를 포착하는 오류 이벤트를 제공합니다.
코드 사본은 다음과 같습니다.
client.on ( 'error', function (e) {
Console.log (e);
});
4, 요약합시다
1. 시작의 관련 개념을 이해하십시오
2. HTTP와 순 모듈의 관계를 이해하십시오
3.이 기사의 예를 바탕으로 연습 할 관련 API를 참조하십시오.
4. 소켓 클라이언트와 서버 간의 통신 아이디어
5. 관심이 있으시면 해당 채팅방의 예를 개선 할 수 있습니다.