創(chuàng)建TCP服務(wù)器
Node.js中提供?.NET模塊,用來(lái)實(shí)現(xiàn)TCP服務(wù)器與TCP客戶端之間的通信。
當(dāng)我們使用JAVAScript來(lái)開(kāi)發(fā)服務(wù)端的時(shí)候,只需要調(diào)用net模塊就可以了。比如現(xiàn)在要?jiǎng)?chuàng)建一個(gè)TCP服務(wù)器,代碼如下:App.js
const net = require("net");
const server = net.createServer(() => {
console.log("客戶端與服務(wù)器端連接已經(jīng)建立")
})
server.listen("8000", 'localhost', function () {
console.log("服務(wù)端開(kāi)始監(jiān)聽(tīng)")
console.log("地址信息:",server.address())
})
這是簡(jiǎn)單的一個(gè)TCP通信,現(xiàn)在執(zhí)行命令:node app.js
在瀏覽器輸入localhost:8000。
這是終端的信息:
服務(wù)端開(kāi)始監(jiān)聽(tīng)
地址信息: { address: '127.0.0.1', family: 'IPv4', port: 8000 }
客戶端與服務(wù)器端連接已經(jīng)建立
我們的瀏覽器輸入localhost:8000回車后,就是客戶端與服務(wù)端建立的TCP通信。啟動(dòng)服務(wù)端,但是客戶端沒(méi)有連接,終端信息如下:
服務(wù)端開(kāi)始監(jiān)聽(tīng)
地址信息: { address: '127.0.0.1', family: 'IPv4', port: 8000 }
createServer方法返回被創(chuàng)建的TCP服務(wù)器,它的回調(diào)函數(shù)有一個(gè)參數(shù),是TCP服務(wù)器監(jiān)聽(tīng)的socket端口對(duì)象。這是在createServer的回調(diào)函數(shù)中監(jiān)聽(tīng)connection事件。
然而,我們可以單獨(dú)對(duì)connection事件進(jìn)行監(jiān)聽(tīng):
const net = require("net")
const server = net.createServer();
server.listen(8000, 'localhost', function () {
console.log('地址信息:', server.address())
});
server.on("connection", function (socket) {
console.log('客戶端開(kāi)始已經(jīng)連接');
socket.setEncoding('utf8'); // 設(shè)置內(nèi)容格式
socket.on("data", function (res) {
console.log("data==", socket.bytesRead)
});
socket.on('end', function () {
console.log("客戶端關(guān)閉連接")
})
})
現(xiàn)在我們建立好了TCP服務(wù)器。
可以使用socket對(duì)象的pipe方法將客戶端發(fā)送的數(shù)據(jù)流寫(xiě)入到其他文件中去:
客戶端的完整代碼:
const net = require("net")
const server = net.createServer();
const file = require('fs').createWriteStream('./text.txt');
server.listen(8000, 'localhost', function () {
console.log('地址信息:', server.address())
});
server.on("connection", function (socket) {
console.log('客戶端開(kāi)始已經(jīng)連接');
socket.setEncoding('utf-8'); // 設(shè)置內(nèi)容格式
socket.on("data", function (res) {
console.log("data==", socket.bytesRead)
});
socket.pause();
socket.resume();
socket.pipe(file, { end: false });
// 客戶端關(guān)閉連接時(shí)候,添加的結(jié)束標(biāo)志
socket.on("end", function () {
file.end("結(jié)束了");
socket.unpipe(file); // 取消對(duì)文件的寫(xiě)入
})
socket.on('end', function () {
console.log("客戶端關(guān)閉連接")
})
})
創(chuàng)建TCP客戶端
const net = require("net");
const client = new net.Socket();
client.setEncoding("utf8");
client.connect(8000, 'localhost', function () {
console.log('已經(jīng)連接服務(wù)器了');
client.write('你好')
});
client.on('data', function (data) {
console.log("服務(wù)器發(fā)送的數(shù)據(jù)", data)
})
客戶端連接服務(wù)端后,服務(wù)端的日志文件text.txt,寫(xiě)入了“你好”