<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
TCP/IP是網際網路相關協定的集合,分為以下四層:應用層、傳輸層、網路層、資料鏈路層。
分成四層的好處是,假如只有一層,某個地方需要改變設計時,就必須把所有整體替換掉,而分層之後只需把變動的層替換掉即可。
node提供了net模組來實現tcp程式設計。主要分為伺服器端程式設計和使用者端程式設計兩部分,先來寫伺服器端的:
先引入net模組,再通過net.createServer 建立一個TCP伺服器,伺服器可以監聽一個connection事件。
net.createServer([options][, connectionListener])
options
<Object>
allowHalfOpen
<boolean> 表明是否允許半開的 TCP 連線。預設值: false
。pauseOnConnect
<boolean> 表明是否應在傳入連線上暫停通訊端。預設值: false
。connectionListener
<Function> 自動設定為 'connection'
事件的監聽器我們先不傳引數:
var net = require('net'); //建立tcp伺服器 var server = net.createServer(); //監聽connect事件 server.on('connection', (socket) => { socket.on('data',(data)=>{ console.log(data.toString(), 'data') }) }) //設定監聽埠 server.listen(8989); //設定監聽時的回撥函數 server.on('listening', (res)=>{ console.log('in listen...') })
connection事件當有資料傳送過來時會被觸發。監聽函數的引數是一個socket,使用者可以使用它與使用者端進行互動。
通過socket的data事件可以列印出傳送過來的資料,在瀏覽器中開啟 http://localhost:8989,瀏覽器會將請求頭的資訊傳送到server,所以輸出結果如下:
上面程式碼中,connection事件可以傳入到createServer中,listen和listening可以合併,寫成下面這種形式:
//第二種寫法 var net = require('net'); //建立tcp伺服器 var server = net.createServer((socket) => { socket.on('data', (data) => { console.log(data.toString(), 'data..') }) }); //設定監聽埠 server.listen(8989, (res) => { console.log('in listen...') });
除了listening和connect事件外,server還有如下事件:
通過socket的data事件接收資料,write方法傳送資料
socket.write(data[, encoding][, callback])
//建立一個TCP伺服器 var server = net.createServer((socket) => { //'connect'事件的回撥函數 console.log('使用者端已連線'); socket.on('end', () => { console.log('使用者端已斷開'); }) //接收來自使用者端的資料 socket.on('data', (data) => { console.log(data.toString(), 'data'); var readSize = socket.bytesRead; console.log('the size of data is ' + readSize); }) //向用戶端寫入資料 socket.write('hellorn'); //設定連線最大數量,可不設 server.maxConnection = 3; server.getConnections(function (err, count) { console.log('the count of clieent is ' + count); }); }) server.listen(8989, () => { console.log('伺服器已啟動'); //獲取地址資訊 var address = server.address(); //獲取地址埠 console.log('the port of server is ' + address.port); console.log('the address of server is ' + address.address); console.log('the ip family of server is ' + address.family); })
我們先不寫使用者端的程式碼,先用telnet工具來當作使用者端來測試上面程式碼
開啟命令列工具輸入 telnet localhost 8989
可以看到socket.write('hellorn')這句話已經生效了,伺服器端向用戶端返回了hello,但這樣肯定還不夠,
使用者端程式設計比伺服器端簡單,因為不用監聽埠。只要把資料從指定的埠發出去就可以了。
net.createConnection(options[, connectListener]) 用來建立一個socket。第一個引數必填,要寫傳送的埠號,第二個引數是這個socket的'connect'事件的回撥函數
//建立一個使用者端 var client = net.connect({ port: 8989 }, () => { console.log('連線到伺服器'); //向伺服器端傳送資料 client.write('hello,i am from client'); }) //監聽事件,當伺服器端傳送資料過來時會觸發該事件 client.on('data', (data) => { console.log(data, 'data'); client.end() }) client.on('end', () => { console.log('已從伺服器斷開'); });
上面程式碼的client就是一個socket,所以可以監聽data事件來獲取伺服器端傳送來的資料。然後socket也可以通過write來向伺服器端傳送資料
利用上面的知識,可以實現一個小型的登入系統:
/*server.js*/ var net = require('net'); //這兒用一個物件來模擬資料庫,儲存使用者名稱和密碼 var user = { admin: '123', test: '333', lucy: '222', } //臨時變數儲存使用者輸入的內容 var username = ''; var server = net.createServer((socket)=>{ console.log('伺服器已連線'); socket.write('請輸入使用者名稱:'); socket.on('data',(data)=>{ //通過stdin輸入的內容是buffer,需要轉成字串且清除空格 data = data.toString().trim(); if(!username){ if(user[data]){ socket.write('請輸入密碼:'); username = data; }else{ socket.write('使用者名稱不對,請輸入使用者名稱:'); } }else { if(user[username] === data){ socket.write('登入成功'); }else { socket.write('密碼不對,請輸入密碼:'); } } }); socket.on('close',data=>{ console.log(data); }) }) server.listen(8899,()=>{ console.log('伺服器監聽8899埠中') })
到此這篇關於基於node的tcp使用者端和伺服器端的簡單通訊的文章就介紹到這了,更多相關基於node的tcp使用者端和伺服器端的簡單通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45