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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章