淺談對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有更快的響應時間,得到更好的用戶體驗