Nodejs之TCP服務端與客戶端聊天程式詳解

Nodejs之TCP服務端與客戶端聊天程式詳解
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

TCP是用來計算機之間進行通訊的,通過編寫客戶端和服務端聊天的程式碼,對於伺服器與客戶端的工作步驟有了深刻的瞭解,在這裡根據了不起的Node.js一書來總結一下。

TCP聊天程式需要用到Nodejs中的net模組,net模組是對TCP的封裝,用於建立TCP服務端與客戶端的。

伺服器端

count:連線的客戶端個數;
users:用於儲存客戶端使用者暱稱的物件,物件值都為該客戶端的Socket,Socket是一個介面,用於服務端與客戶端通訊。
net.createServer:是用來建立TCP伺服器,傳遞的函式為connetion事件的監聽器,connection事件在有客戶端連線上伺服器後觸發,傳進去的引數conn是一個socket,即net.Socket的例項,是既可讀也可寫的。
conn:是回撥函式的引數,每一個客戶端對應的conn都是不一樣的,伺服器會自動識別。
conn.write:是將資料傳送到客戶端上。
nickname:是額戶端的暱稱,當nickname為undefined時,代表客戶端還沒有輸入暱稱,需要輸入暱稱驗證,若不為空則已經儲存,代表輸入的資料是對話,需顯示到其他的客戶端上。
conn.on(‘data’,function (data){…}):是用來接收客戶端傳來的資料。


/*server.js*/
var net=require('net');
var count=0;
var users={};
var server=net.createServer(function (conn) {
conn.setEncoding('utf8');
conn.write(count ' people are connected'
'\nplease write your nickname:');
count  ;
var nickname;
conn.on('data',function (data) {
data=data.replace(/\r\n/,'');
if(!nickname){
if(users[data]){
conn.write('\n nickname already used,try again:');
return;
}else {
nickname=data;
users[nickname]=conn;//每個客戶端對應的conn是不一樣的
for(var i in users){
users[i].write(nickname ' join the romm\n');
}
}
}else {
conn.write('傳送者nickname: ' nickname '\n');
for(var i in users){
if(i!=nickname){
users[i].write(nickname ': ' data '\n');
}
}
}
});
conn.on('close',function () {//這裡防止連線出錯,使用close而非end
console.log(nickname ' client disconnected\n');
count--;
delete users[nickname];
});
conn.on('error',function (err) {
console.log('Error in connection:'  err '\n');
});
}).listen(3000,function () {
console.log('server is listenning on 3000');
});

客戶端

process.stdin.resume():process.stdin流來接受使用者的鍵盤輸入,這個可讀流初始化時處於暫停狀態,呼叫流上的resume()方法來恢復流。
process.stdin.on(‘data’, function(data){…}):是用來獲取鍵盤的輸入,並用client.write()將它傳送到服務端。
stop:用來判斷客戶端是否是正常斷開連線。
net.createConnection:是用來建立於服務端的連線,並且給connect事件自動新增監聽器,監聽器不接收引數。返回的是 ‘net.Socket’。


/*client.js*/
var net=require('net');
var stop = false;
process.stdin.resume(); 
process.stdin.on('data', function(data){
if(data.toString().trim().toLowerCase()==='stop'){
stop=true;
console.log('connection stop\n');
client.end();
}else{
client.write(data);
}
});
var client=net.createConnection(3000,function () {
console.log('connected to server!\n');
});
client.on('data', function(data) {
console.log(data.toString());//列印伺服器傳送的資料
});
client.on('error', function(err) {
console.log('Error in connection:'  err '\n');
});
client.on('close', function() {
if(! stop) {
console.log('connection got closed');
}
});

TCP聊天程式

這裡是在git中執行的,連線了3個客戶端的測試結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家。

您可能感興趣的文章:

淺析nodejs實現Websocket的資料接收與傳送基於html5和nodejs相結合實現websocket即使通訊用nodejs搭建websocket伺服器nodejs websocket實時聊天系統改進版使用DNode實現php和nodejs之間通訊的簡單例項nodejs socket服務端和客戶端簡單通訊功能nodejs實現的一個簡單聊天室功能分享使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室Nodejs實現多房間簡易聊天室功能nodejs基於WS模組實現WebSocket聊天功能的方法

相關文章

前端開發 最新文章