使用原始套接字有一些問題:您必須同步發送數據到端口;手動檢查該插座是否已連接;通過包分割傳入的原始數據。以簡單的客戶端示例作爲包裝分隔符|
。
// Bad code; wait of improvements
'use strict'
const net = require('net');
const EventEmitter = require('events');
const util = require('util');
function Listener (opts) {
this.send = send;
let listener = this;
let queue = [];
let isBusy = true;
let socket;
connect(opts);
function send (data) {
queue.push(data);
if (isBusy)
return;
isBusy = true;
next();
}
function next() {
if (queue.length == 0)
return (isBusy = false);
if (socket) {
socket.write(data + '|', function (err) {
if (err)
return socket.emit('error', err);
queue.shift();
next();
});
}
}
function connect (opts) {
socket = net.connect({host: opts.host, port: opts.port});
queue = [];
isBusy = true;
socket.on('connect',() => {
isBusy = false;
listener.emit('connect');
});
let buffer = '';
socket.on('data', function(chunk) {
buffer += chunk;
let msgs = buffer.split('|');
buffer = msgs.pop();
msgs.forEach((msg) => listener.emit('message', msg));
});
socket.on('close',() => listener.emit('disconect'));
socket.on('error', (err) => listener.emit('error', err));
}
}
util.inherits(Listener, EventEmitter);
let listener = new Listener({host: '127.0.0.1', port: 111});
listener.on('connect',() => ...);
listener.on('disconnect',() => ...);
listener.on('error', (err) => ...);
listener.on('message', (msg) => ...);
listener.send('Hello world'); // between connect and disconnect;
你看過[Socketio](http://socket.io/)嗎?這可能是需要考慮的事情。 – ishmaelMakitla
yaa我正在檢查,但會不斷聽TCP服務器? – Vishrant
但是你有沒有嘗試過 - 你可以保持套接字連接打開並讀取數據,比如'conn.on('some-event',function(some-data-object){})' - 但問題是你的問題最多可能會徵求意見,這就是爲什麼應該避免這些。選擇一種可能的解決方案,嘗試一下,當你遇到錯誤時,在這裏發佈具體問題。 – ishmaelMakitla