Node.js中的網絡編程

實驗簡介

此實驗主要講解TCP和UDP的網絡編程遍蟋,net模塊提供了一個異步網絡包裝器琐簇,用于TCP網絡編程,它包含了創(chuàng)建服務器和客戶端的方法衡创。dgram模塊用于UDP網絡編程。
參考鏈接:https://nodejs.org/api/net.html, https://nodejs.org/api/dgram.html

TCP Server

net模塊通過net.createServer方法創(chuàng)建TCP服務器晶通,通過net.connect方法創(chuàng)建客戶端去連接服務器璃氢。
通過net模塊創(chuàng)建一個TCP Server:
<pre>
// server.js
var net = require('net');
// 創(chuàng)建TCP服務器
var server = net.createServer(function(socket) {
console.log('client connected');
// 監(jiān)聽客戶端的數據
socket.on('data', function(data) {
console.log('server got data from client: ', data.toString());
});
// 監(jiān)聽客戶端斷開連接事件
socket.on('end', function(data) {
console.log('connection closed');
});
// 發(fā)送數據給客戶端
socket.write('Hello\r\n');
});
// 啟動服務
server.listen(8080, function() {
console.log('server bound');
});
</pre>
然后再創(chuàng)建一個客戶端:
<pre>
// client.js
var net = require('net');
// 連接服務器
var client = net.connect({port: 8080}, function() {
console.log('connected to server');
client.write('World!\r\n');
});
// 接收服務端的數據
client.on('data', function(data) {
console.log('client got data from server: ', data.toString());
// 斷開連接
client.end();
});
// 斷開連接
client.on('end', function() {
console.log('disconnected from server');
});
</pre>
運行測試:

在虛擬機中打開兩個終端,先運行TCP服務器代碼:
<pre>$ node server.js</pre>
然后在另一個終端運行TCP客戶端代碼:
<pre>$ node client.js</pre>
即可看到兩個終端運行結果狮辽。

簡易聊天室服務端

了解了基礎的東西一也,下面我們來做一個簡單的聊天室吧。
首先創(chuàng)建TCP服務器喉脖,和前面一樣:
<pre>
// chatServer.js
var net = require('net');
// 創(chuàng)建TCP服務器
var server = net.createServer();
// 存儲所有客戶端socket
var sockets = [];
server.on('connection', function(socket) {
console.log('Got a new connection');
sockets.push(socket);
socket.on('data', function(data) {
console.log('Got data: ', data);
sockets.forEach(function(otherSocket) {
if (otherSoecket !== socket) {
otherSocket.write(data);
}
});
]);
// 新增代碼
socket.on('close', function() {
console.log('A client connection closed');
var index = sockets.indexOf(socket);
sockets.splice(index, 1);
});
});
server.on('error', function(err) {
console.log('Server error: ', err.message);
});
server.on('close', function() {
console.log('Server closed');
});
server.listen(8080);
</pre>

簡易聊天室客戶端

聊天室的服務端功能基本就實現了椰苟,下面我們來寫一個簡單的客戶端吧:
<pre>
// chatClient.js
var net = require('net');
process.stdin.resume();
process.stdin.setEncoding('utf8');
var client = net.connect({ port: 8080 }, function() {
console.log('Connected to server');
// 獲取輸入的字符串
console.log('input: ');
process.stdin.on('data', function(data) {
// 發(fā)送輸入的字符串到服務器
console.log('input: ');
client.write(data);
// 輸入 'close' 字符串時關閉連接
if (data === 'close\n') {
client.end();
}
});
});
// 獲取服務端發(fā)送過來的數據
client.on('data', function(data) {
console.log('Other user's input', data.toString());
});
client.on('end', function() {
console.log('Disconnected from server');
// 退出客戶端程序
process.exit();
});
</pre>

客戶端中用到了process這個模塊,process是一個Node.js的全局模塊树叽,可以在任何地方
直接使用而無需通過require方法引入舆蝴。process模塊允許你獲得或者修改當前Node.js
進程的設置。process.stdin用于獲取來自標準輸入的可讀流(Readable Stream)题诵。

現在來運行這個聊天室吧:
<pre>$ node chatServer.js</pre>
在打開多個終端窗口洁仗,運行:
<pre>$ node chatClient.js</pre>
然后在任意運行的客戶端輸入字符串并按回車鍵,會在服務端和其他客戶端開到這個客戶端的輸入內容性锭。這樣就實現了一個簡單的聊天室了_赠潦。

UDP Server

UDP和TCP類似,通過dgram.createSocket創(chuàng)建服務草冈。
UDP服務器:
<pre>
// udpServer.js
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
server.on("error", function(err) {
console.log("server error:\n" + err.stack);
server.close();
});
// 接收來自客戶端的消息
server.on("message", function(msg, rinfo) {
console.log("server got: " + msg.toString() + " from " + rinfo.address + ":" + rinfo.port);
});
// 監(jiān)聽服務
server.on("listening", function() {
var address = server.address();
console.log("server listening on " + address.address + ":" + address.port);
});
server.bind(41234);
// server listening 0.0.0.0:41234
</pre>
UDP客戶端:
<pre>
// udpClient.js
var dgram = require('dgram');
var client = dgram.createSocket('udp4');
var message = new Buffer('hello shiyanlou');
client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) {
client.close();
});
</pre>
發(fā)送的消息必須通過Buffer創(chuàng)建她奥。
然后運行服務端:
<pre>$ node server.js</pre>
再運行客戶端:
<pre>$ node client.js</pre>
此時,服務端就會收到來自客戶端的消息怎棱。

Node.js基礎的網絡編程就講到這里了方淤。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹄殃,隨后出現的幾起案子携茂,更是在濱河造成了極大的恐慌,老刑警劉巖诅岩,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讳苦,死亡現場離奇詭異带膜,居然都是意外死亡,警方通過查閱死者的電腦和手機鸳谜,發(fā)現死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門膝藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咐扭,你說我怎么就攤上這事芭挽。” “怎么了蝗肪?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵袜爪,是天一觀的道長。 經常有香客問我薛闪,道長辛馆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任豁延,我火速辦了婚禮昙篙,結果婚禮上,老公的妹妹穿的比我還像新娘诱咏。我一直安慰自己苔可,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布袋狞。 她就那樣靜靜地躺著焚辅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硕并。 梳的紋絲不亂的頭發(fā)上法焰,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天秧荆,我揣著相機與錄音倔毙,去河邊找鬼。 笑死乙濒,一個胖子當著我的面吹牛陕赃,可吹牛的內容都是我干的。 我是一名探鬼主播颁股,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼么库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甘有?” 一聲冷哼從身側響起诉儒,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亏掀,沒想到半個月后忱反,有當地人在樹林里發(fā)現了一具尸體泛释,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年温算,在試婚紗的時候發(fā)現自己被綠了怜校。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡注竿,死狀恐怖茄茁,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情巩割,我是刑警寧澤裙顽,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響对嚼,放射性物質發(fā)生泄漏传轰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一甘萧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梆掸,春花似錦扬卷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卑硫,卻和暖如春徒恋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欢伏。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工入挣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硝拧。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓径筏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親障陶。 傳聞我的和親對象是個殘疾皇子滋恬,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容