NodeJS의 Socket.io를 사용하여 간단한 WebSocket 서버 만들기
처음에
API를 사용한 통신에서는 서버에 요청한 모든 처리가 완료된 후 응답이 반환됩니다. 따라서 처리에 시간이 많이 걸리는 프로세스를 실행하려는 경우 클라이언트 측이 상당한 시간 서버의 응답을 기다리는 상태가됩니다.
실시간으로 순차적으로 서버의 실행 결과를 반환하는 통신 방법에는 WebSocket이 있으므로 실시간 통신의 수단으로 nodejs의 WebSocket을 사용하여 구현했다.
WebSocket의 통신 흐름으로서는
1. 클라이언트와 서버가 Socket 연결을 설정합니다.
2. 받은 서버가 서버측에서 처리 실행
3. 서버가 클라이언트에 처리 결과를 순차적으로 전송
4. 처리가 끝나면 Socket 연결을 끊습니다.
구현
개발 환경은 다음과 같습니다.
개발 환경은 다음과 같습니다.
라이브러리 설치
WebSocket 라이브러리는 유명한 socket.io를 사용합니다.
그러나 socket.io는 서버 측 전용 라이브러리이므로 클라이언트로 사용할 수 없습니다. 따라서 Socket 통신의 클라이언트를 만들려면
socket.io-client
라이브러리를 사용해야합니다.$ npm install --save socket.io
$ npm install --save socket.io-client
socket.io에서는 서버 클라이언트에 관계없이 원칙,
로 통신합니다.
Socket 서버 만들기
처리를 실행하는 서버 측을 구현합니다.
먼저
io.on('connection')
에서 클라이언트의 연결을 기다립니다. 그런 다음 클라이언트로부터 연결 요청을 수신하고 연결을 시작합니다. 소켓 통신 중에는 socket 객체가 클라이언트의 처리 트리거를 기다리고 트리거를 수신하면 처리를 시작합니다. 서버에서 클라이언트로 처리 결과를 반환하려면 socket.emit()
에 트리거 이름을 지정하여 실행하여 클라이언트로 보냅니다.server.js
const io = require('socket.io')(8023);
const exec = require('child_process').exec;
var execCmd;
/*
* サーバの接続
*/
io.on('connection', function ( socket ) {
// コマンドの実行
socket.on('exec', function ( command ) {
execCmd = exec(command);
console.log(execCmd.pid);
execCmd.stdout.on('data',function(data) {// 実行中の出力を受け取る
console.log(data);
data = data.split(/\r\n|\n/);
io.sockets.emit('response', {data:data});
});
execCmd.stderr.on('data', function (data) {// エラーの出力を受け取る
console.log(data);
data = data.split(/\r\n|\n/);
io.sockets.emit('response', {data:data});
});
execCmd.on('exit', function (code) {// 処理が終了したことをクライアントに送信
io.sockets.emit('exit', {data:code});
});
});
});
console.log('Start socket server : http://127.0.0.1:8023');
소켓 통신이 시작된 후
exec
트리거를 수신하면 child_process
에서 nodejs에서 터미널 명령을 실행하고 한 줄 출력 될 때마다 출력 결과를 response
트리거로 클라이언트에 반환하는 서버를 만들었습니다.클라이언트 측 만들기
이번에는 실험을 위해 초당 현재 시간을 터미널 출력하는 처리를 5 회 반복하는 명령을 작성하여 서버 측에서 실행합니다.
client.js
cconst io = require('socket.io-client');
// 1秒ごとに現在の時間をプリントするコマンド
var command = 'for i in `seq 1 5`; do date; sleep 1s; done';
var socket = io.connect('http://localhost:8023');//接続先のサーバを指定
console.log(command);
socket.on('connect' ,function (data) {//コネクションの接続
socket.emit('exec',command,function(msg){//シェルコマンドを送る
console.log(msg);
});
socket.on('response',function(msg){//サーバからのレスポンスを受け取る
msg = msg['data'];
console.log(msg);
});
socket.on('exit',function(msg){//終了を受け取ったらSocket通信を終了する
console.log(msg);
socket.disconnect()
});
});
클라이언트는 서버의
socket.on('response')
트리거를 기다리고 수신 된 응답을 클라이언트 측 터미널에 출력합니다.중요한 것은
socket.on('exit')
부분. 처리가 끝나면 Socket 통신을 끊지 않으면 통신 확실하지 않기 때문에 종료 처리는 반드시 넣어 둔다.실행
처음에 Socket 서버 시작
서버측$ node server.js
Start socket server : http://127.0.0.1:8023
클라이언트에서 Socket 서버로의 처리 실행 요청.
클라이언트측$ node client.js
실행 결과는 다음과 같습니다.
최초의 출력은 썼지만, 일반적으로 정상적으로 1초마다 5회 처리가 반복되어, 접속이 절단된 것을 확인할 수 있었다.
끝에
처리에 시간이 걸리는 것,
API와 WebSocket, 용도에 따라 구분하면 좋을 것 같다.
Reference
이 문제에 관하여(NodeJS의 Socket.io를 사용하여 간단한 WebSocket 서버 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sey323/items/ba29376b8aa6a4e77fce
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ node server.js
Start socket server : http://127.0.0.1:8023
$ node client.js
처리에 시간이 걸리는 것,
API와 WebSocket, 용도에 따라 구분하면 좋을 것 같다.
Reference
이 문제에 관하여(NodeJS의 Socket.io를 사용하여 간단한 WebSocket 서버 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sey323/items/ba29376b8aa6a4e77fce텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)