編寫一個 TCP 時間服務器
服務器監(jiān)聽一個端口,以獲取一些TCP連接,這個端口會經(jīng)由第一個命令行參數(shù)傳遞給程序。針對每一個 TCP 連接,都必須寫入當前的日期和24小時制的時間,如下格式:
"YYYY-MM-DD hh:mm"
然后緊接著是一個換行符。
月份、日、小時和分鐘必須用零填充成為固定的兩位數(shù):
"2013-07-06 17:42"
這次練習中,將會創(chuàng)建一個 TCP 服務器。這里將不會涉及到任何 HTTP 的事情,因此只需使用 net 這個 Node 核心模塊就可以了。它包含了所有的基礎(chǔ)網(wǎng)絡(luò)功能。
net 模塊擁有一個名叫 net.createServer() 的方法,它會接收一個回調(diào)函數(shù)。和 Node 中其他的回調(diào)函數(shù)不同,createServer() 所用的回調(diào)函數(shù)將會被調(diào)用多次。服務器每收到一個 TCP 連接,都會調(diào)用一次這個回調(diào)函數(shù)。這個回調(diào)函數(shù)有如下特征:
function callback (socket) { /* ... */ }
net.createServer() 也會返回一個 TCP 服務器的實例,必須調(diào)用 server.listen(portNumber) 來讓服務器開始監(jiān)聽一個特定的端口。
一個典型的 Node TCP 服務器將會如下所示:
var net = require('net')
var server = net.createServer(function (socket) {
// socket 處理邏輯
})
server.listen(8000)
記住,請一定監(jiān)聽由第一個命令行參數(shù)指定的端口。
socket 對象包含了很多關(guān)于各個連接的信息(meta-data),但是它也同時是一個 Node 雙工流(duplex Stream),所以,它即可以讀,也可以寫。對這個練習來說,只需要對socket 寫數(shù)據(jù)和關(guān)閉它就可以了。
使用 socket.write(data) 可以寫數(shù)據(jù)到 socket 中,用 socket.end() 可以關(guān)閉一個 socket。另外, .end() 方法也可以接收一個數(shù)據(jù)對象作為參數(shù),因此,可簡單地使用 socket.end(data) 來完成寫數(shù)據(jù)和關(guān)閉兩個操作。
方法一:
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]))
更多建議: