(10)授時(shí)服務(wù)器

2018-02-24 16:05 更新

要求

編寫一個(gè) TCP 時(shí)間服務(wù)器

服務(wù)器監(jiān)聽一個(gè)端口,以獲取一些TCP連接,這個(gè)端口會(huì)經(jīng)由第一個(gè)命令行參數(shù)傳遞給程序。針對(duì)每一個(gè) TCP 連接,都必須寫入當(dāng)前的日期和24小時(shí)制的時(shí)間,如下格式:

"YYYY-MM-DD hh:mm"

然后緊接著是一個(gè)換行符。

月份、日、小時(shí)和分鐘必須用零填充成為固定的兩位數(shù):

"2013-07-06 17:42"

提示

這次練習(xí)中,將會(huì)創(chuàng)建一個(gè) TCP 服務(wù)器。這里將不會(huì)涉及到任何 HTTP 的事情,因此只需使用 net 這個(gè) Node 核心模塊就可以了。它包含了所有的基礎(chǔ)網(wǎng)絡(luò)功能。
net 模塊擁有一個(gè)名叫 net.createServer() 的方法,它會(huì)接收一個(gè)回調(diào)函數(shù)。和 Node 中其他的回調(diào)函數(shù)不同,createServer() 所用的回調(diào)函數(shù)將會(huì)被調(diào)用多次。服務(wù)器每收到一個(gè) TCP 連接,都會(huì)調(diào)用一次這個(gè)回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)有如下特征:

function callback (socket) { /* ... */ }

net.createServer() 也會(huì)返回一個(gè) TCP 服務(wù)器的實(shí)例,必須調(diào)用 server.listen(portNumber) 來(lái)讓服務(wù)器開始監(jiān)聽一個(gè)特定的端口。

一個(gè)典型的 Node TCP 服務(wù)器將會(huì)如下所示:

var net = require('net')
var server = net.createServer(function (socket) {
  // socket 處理邏輯
})
server.listen(8000)

net模塊API文檔

記住,請(qǐng)一定監(jiān)聽由第一個(gè)命令行參數(shù)指定的端口。

socket 對(duì)象包含了很多關(guān)于各個(gè)連接的信息(meta-data),但是它也同時(shí)是一個(gè) Node 雙工流(duplex Stream),所以,它即可以讀,也可以寫。對(duì)這個(gè)練習(xí)來(lái)說(shuō),只需要對(duì)socket 寫數(shù)據(jù)和關(guān)閉它就可以了。

使用 socket.write(data) 可以寫數(shù)據(jù)到 socket 中,用 socket.end() 可以關(guān)閉一個(gè) socket。另外, .end() 方法也可以接收一個(gè)數(shù)據(jù)對(duì)象作為參數(shù),因此,可簡(jiǎn)單地使用 socket.end(data) 來(lái)完成寫數(shù)據(jù)和關(guān)閉兩個(gè)操作。

代碼

方法一:

var net = require('net');

net.createServer(function(socket){
 var date= new Date();
 socket.end(date.toLocaleDateString());
}).listen(process.argv[2]);

方法二:

var net = require('net')

function zeroFill(i) {
 return (i 10 ? '0' : '') + i
}

function now () {
 var d = new Date()
 return d.getFullYear() + '-'
 + zeroFill(d.getMonth() + 1) + '-'
 + zeroFill(d.getDate()) + ' '
 + zeroFill(d.getHours()) + ':'
 + zeroFill(d.getMinutes())
}

var server = net.createServer(function (socket) {
 socket.end(now() + '\n')
})

server.listen(Number(process.argv[2]))
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)