설치완료 하면 node_modules 라는 폴더가 생성되고 기본 내장 js 모듈 파일들이 존재하며 require 키워드를 통해 어디서든 사용가능 하다.
단 라이브러리를 추가할때는 node_modules 폴더가 존재하는 위치에서 mpn ~~ 을 실행하길 추천한다. 테스트 os 는 윈도우 실제 적용환경은 리눅스(centOS) 였음. 아래 코드는 각각의 OS 에서 정상작동한다.
서버코드.
//websocket 객체 생성 (npm 으로 라이브러리를 추가해야한다.) var WebSocketServer = require('websocket').server; //http 객체 생성 var http = require('http');
//nodejs 는 스크립트 오류가 발생시 프로세스가 종료된다. 따라서 예외처리는 필수 try{ //http 객체로부터 서버를 생성한다. var server = http.createServer(function (req, res) { //이부분은 알아서~변경 res.writeHead(404); res.end(); }); //서버포트를 설정한다. 8887번포트 리슨대기 상태 server.listen(8887, function () { }); //websocket 웹소캣 객체생성자에 위에서 생성한 server 객체를 httpServer //값에 셋팅 한다. wsServer = new WebSocketServer({ httpServer: server, autoAcceptConnections: false });
//웹소캣 이벤트 정의 wsServer.on('request', function (request) {
//이부분에서 좀 해맷다. CP의 폐해 //accept 함수 첫번째 인자 값에 연결 데이터방식에 대한 정의가 필요한듯. //null 일경우 모든 client 전송 데이터 연결 허용. //특정문자열을 입력하여 제한가능 한걸로 보임 var connection = request.accept(null, request.origin); //메세지 수신 이벤트 connection.on('message', function (message) { //String 형태로 넘어온데이터 처리 if (message.type === 'utf8') { //로직 //ex) 헬로라는 문자열을 사용자에게 출력. connection.send('hello'); //바이너리 데이터 처리 }else if (message.type === 'binary') { //로직 }else{ //로직 } });
//사용자가 연결을 끊엇을때 이벤트 처리 connection.on('close', function (reasonCode, description) { }); });
}catch(exception){ }
nodejs 기본 제공 하는 socket.io 기술을 사용해서 구현도 가능 하지만 클라이언트 단에 관련라이브러리 js 파일을 넣어줘야한다.
위 기본 형태는 서버와 클라이언트 1:1 통신 이며 서버가 클라이언트 들에게 모두 중개 해야하는 입장이라면 추가로직이 필요할것이다.
클라이언트 코드.
var ws = new WebSocket('ws://아이피:포트');
(ssl 적용관련 설명은 따로 올릴예정)
//웹소켓을 기본적으로 하는 미지원 브라우저도 존재한다. if('WebSocket' in window){ ws.onopen=function(e){ console.log(e); console.log("onopen"); } ws.onclose=function(e){ console.log(e); console.log("onclose"); } ws.onerror=function(e){ console.log(e); console.log("onerror"); } ws.onmessage = function (evt) { console.log(e); console.log("onerror"); };
cert: fs.readFileSync("/디렉토리/xxxx.crt" 도메인정보 로 여겨짐)
};
//위에서 생성한 옵션을 넘겨서 https 서버를 생성하한다.
var httpsServer = https.createServer( https_options, function(request, response) {
console.log((new Date()) + ' Received request for ' + request.url);
response.writeHead(404);
response.end();
});
//포트설정
httpsServer.listen(8887);
//ws 모듈이 내부적으로 없을경우 설치
var WebSocketServer = require('ws').Server;
//웹소켓 서버 생성
var wss = new WebSocketServer({
server: httpsServer,
// You should not use autoAcceptConnections for production
// applications, as it defeats all standard cross-origin protection
// facilities built into the protocol and the browser. You should
// *always* verify the connection's origin and decide whether or not
// to accept it.
autoAcceptConnections: false
});
function originIsAllowed(origin) {
// put logic here to detect whether the specified origin is allowed.
return true;
}
wss.on('connection', function connection(ws) {
//.수신처리
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
// 발신
ws.send('something');
});
일반 http 프로토콜 기반 웹소켓 서버를 생성하는것과 그렇게 큰차이는 없다.
그치만 ssl에 대한 기본 적인 개념이 없다면 아마 막히는 부분이 많을 것이다.
ssl 통신.
클라이언트 측에서 https://aaa.com 요청을 보내면
1. aaa.com 도메인에 연결된 웹서버에서 인증서 정보화 공개키 정보를 담아서 클라이언트에게 전달한다.
2. 전달받은 클라이언트는 브라우저 내부적으로 인증기관정보 및 도메인 정보를 가지고 신뢰할수 있는 도메인 유무를 확인후 랜덤으로 생성 한 대칭키를 클라이언트에게 전달한다.
3. 클라이언트는 전달받은 대칭키로 데이터및 url 을 암호화 하고 대칭키를 처음에 서버로부터 받은 공개키로 또 암호화를해서 서버로 데이터를 전송한다.
4. 서버는 받은 대칭키를 개인키로 복호화하고 복호화된 대칭키로 데이터를 다시 복호화 한다.
5. 서버에서 데이터 전송시 데이터를 개인키로 암호화후 전송한고 클라이언트는 공개키로 복호화한다.
예를들면 aaa.com 에 적용된 ssl 인증서 정보로 wss://아이피:포트 웹소켓서버에 ssl을 동일 하게 적용해도 인증업체에 도메인 등록이 되어있지 않으면 통신이 불가능 하다. 따라서 인증업체에 도메인 추가를 한후 다시 인증서를 받아서 처리하거나(그다지 추천하는 방식은아님) ssl 터널링 기술을 이용해야한다.
=================================
=================================
=================================
출처: https://www.npmjs.com/package/websocket
Installation
A few users have reported difficulties building the native extensions without first manually installing node-gyp. If you have trouble building the native extensions, make sure you've got a C++ compiler, and have done npm install -g node-gyp first.
Native extensions are optional, however, and WebSocket-Node will work even if the extensions cannot be compiled.
In your project root:
$ npm install websocket
Then in your code:
var WebSocketServer =require('websocket').server;
var WebSocketClient =require('websocket').client;
var WebSocketFrame =require('websocket').frame;
var WebSocketRouter =require('websocket').router;
var W3CWebSocket =require('websocket').w3cwebsocket;
Note for Windows Users
Because there is a small C++ component used for validating UTF-8 data, you will need to install a few other software packages in addition to Node to be able to build this module:
Node.js: Simple TCP Server & Client and Promisify the Client
By Brij Mohan
In this post, you will see an example of simple TCP server and client in traditional javascript way and in ES6 way. Node.js has net module which provides an asynchronous network API for creating stream-based TCP or IPC servers and clients. We are going to use it to implement TCP server and client. This post is updated with Node v6.11.2.
console.log('Client connected to: '+ HOST + ':'+ PORT);
// Write a message to the socket as soon as the client is connected, the server will receive it as message from the client
client.write('Hello World!');
});
client.on('data', function(data) {
console.log('Client received: '+ data);
if(data.toString().endsWith('exit')) {
client.destroy();
}
});
// Add a 'close' event handler for the client socket
client.on('close', function() {
console.log('Client closed');
});
client.on('error', function(err) {
console.error(err);
});
Output:
Server:
D:\node>node server.js server listening on {"address":"127.0.0.1","family":"IPv4","port":1234} new client connected: 127.0.0.1:62682 127.0.0.1:62682 Says: Hello World! connection from 127.0.0.1:62682 closed
console.log('Client connected to: '+ HOST + ':'+ PORT);
// Write a message to the socket as soon as the client is connected, the server will receive it as message from the client
client.write('Hello World!');
});
client.on('data', function(data) {
console.log('Client received: '+ data);
if(data.toString().endsWith('exit')) {
client.destroy();
}
});
// Add a 'close' event handler for the client socket
client.on('close', function() {
console.log('Client closed');
});
client.on('error', function(err) {
console.error(err);
});
Output:
Server:
D:\node>node server.js server listening on {"address":"127.0.0.1","family":"IPv4","port":1234} new client connected: 127.0.0.1:62682 127.0.0.1:62682 Says: Hello World! connection from 127.0.0.1:62682 closed
D:\node>node serverTest.js Server started at: localhost:1234 new client connected: 127.0.0.1:62846 127.0.0.1:62846 Says: Hello World! connection from 127.0.0.1:62846 closed
In your Node application, you might need to trigger server on a particular event like on button click and you want to get ES6 Promise object for neat implementation.
D:\node>node serverTest.js Server started at: localhost:1234 new client connected: 127.0.0.1:63007 127.0.0.1:63007 Says: A 127.0.0.1:63007 Says: B 127.0.0.1:63007 Says: C 127.0.0.1:63007 Says: exit connection from 127.0.0.1:63007 closed
Client:
D:\node>node clientTest.js Client connected to: localhost : 1234 Received: A Received: B Received: C Client closed
Conclusion:
This post has an example of TCP server and client in traditional javascript and ES6 way. Also, an example of promisifying TCP client for better architecture.