web前端技術基礎課程講解之淺談對soket的理解
淺談對soket的理解
定義:
網路上的兩個程式通過一個雙向的通訊鏈實現資料的交換,這個連結的一端就成為Socket
它是程序通訊的一種,即呼叫這個網路庫的api函式實現分佈在不同主機相關程序之間的資料交換,依照tcp/ip協議分給每個主機的網路地址,如果兩個主機要進行通訊,任何一個程序都要首先知道對方的網路地址,也可以說是對方的IP。
埠號用來辨別本地程序,一個本地的程序通訊時,,都要佔用一個埠號,不同的程序埠號不同,因為在本地程序進行之前,首先要分配一個沒有被佔用的埠號,。
連結:是指兩個程序通訊之間的鏈路。
實現原理:
在TCP/IP網路應用中,通訊的兩個程序之間的主要模式為客戶/伺服器端(即client/server C/S)模式,即客戶端向伺服器發出服務請求,伺服器收到請求以後,向客戶端提供相應的服務,C/S模式建立需要的兩個條件:(1)網路中軟硬體資源,運算能力,資訊不均等,需要共享(2)連個網路程序是完全非同步的,需要一種機制為通訊的程序間建立關係,為兩者的資料交換提供同步,這就是基於C/S模式的TCP/IP;
工作過程:
伺服器啟動,根據請求提供相應的服務(1)開啟一通訊通道,告知本地主機,它願意在公認的某一埠接受客戶請求(2)請求客戶請求到達埠(3)收到客戶請求,處理併發出應答訊號,接收到併發出應答請求,這需要出發一個新的程序來處理這個客戶請求,這個程序不需要發出應答,服務處理完成後,關閉新程序與客戶端的鏈路(4)返回第(2)步,等待另一客戶端發來請求
關閉伺服器:
(1)開啟一個通訊通道,連線到伺服器所在的主機埠號,(2)向伺服器傳送伺服器報文,等待並接收應答,繼續傳送報文(3)請求結束後,關閉通道
過程總結:客戶端和伺服器端是不對等的,所以兩端的程式碼時不同的,伺服器程序一般是先啟動的,只要系統執行,該伺服器程序一直存在,除非正常或者被迫中止
基於net 模組實現通訊
Node.js的net模組提供了一些底層通訊的小工具,其中包括建立C/S模式的方法
伺服器端程式碼
var net=require('net')
var server=new net.createServer();
//用來存放多個socket使用者物件的集合
var obj=new Object()
//流水賬號--保證使用者不重複
var i=0;
server.on('connection',(client)=>{
client.name=++i;
obj[client.name]=client
// client==像伺服器傳送資料的socket物件
client.on('data',(data)=>{
console.log('客戶端發來:--'+data)
huifu(data,client)
})
})
function huifu(message,client){
// client.write('伺服器已經收到')
for (let i in obj) {
obj[i].write(client.name+'說:'+message)
}
}
server.listen(3000)
客戶端程式碼
var net=require('net')
var readline=require('readline')
//建立socket物件
var client=new net.Socket();
var port=3000;
var hostname='localhost';
client.connect(port,hostname,()=>{
client.write('hello 客戶端已經上線')
})
client.on('data',(data)=>{
console.log('收到伺服器回覆:--'+data)
say()
})
var r1=new readline.createInterface({
input:process.stdin,
output:process.stdout
})
function say(){
r1.question('請輸入要傳送的內容:',(str)=>{
client.write(str)
})
}
Websoket
是h5提供的一種雙工通訊的協議,而且目前所有流行的瀏覽器都支援這個協議
new WebSocket("ws://echo.websocket.org");申請一個WebSocket物件,引數是需要連線的伺服器端的地址,WebSocket物件一共支援四個訊息 onopen, onmessage, onclose和onerror。當Browser和WebSocketServer連線成功後,會觸發onopen訊息;如果連線失敗,傳送、接收資料失敗或者處理資料出現錯誤,browser會觸發onerror訊息;當Browser接收到WebSocketServer傳送過來的資料時,就會觸發onmessage訊息,引數evt中包含server傳輸過來的資料;當Browser接收到WebSocketServer端傳送的關閉連線請求時,就會觸發onclose訊息。我們可以看出所有的操作都是採用訊息的方式觸發的,這樣就不會阻塞UI,使得UI有更快的響應時間,得到更好的使用者體驗