首先聲明哦,
它和websocket完全是兩個(gè)概念。websocket是一個(gè)全雙工通訊協(xié)議。而socket是作為進(jìn)程通訊機(jī)制而存在的,通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。
下面這段文字摘抄自segmentfault中的一個(gè)答案(我覺得還挺通俗易懂的):
socket 在操作系統(tǒng)里面是一個(gè)文件描述符, 和普通的文件的文件描述符一樣,可以通過系統(tǒng)調(diào)用 read(), write()進(jìn)行讀取和寫入數(shù)據(jù).
每一個(gè)socket 其實(shí)有幾個(gè)重要的參數(shù), 本機(jī)ip,本機(jī)port,對(duì)端ip,對(duì)端port,以及協(xié)議等, 這幾個(gè)通常要是unique的, 操作系統(tǒng)才不會(huì)把socket 和 socket 之間搞混.
服務(wù)器端的程序,一般會(huì)把socket 和某一個(gè)ip,port 端口bind 起來, 這樣構(gòu)成了一個(gè)特殊的socket, 這個(gè)socket 沒有對(duì)端ip和對(duì)端port, 只有本機(jī)ip和本機(jī)port.
你可以把這個(gè)socket 看成是一個(gè)特殊的文件(好比登記表), 當(dāng)有新的連接進(jìn)來的時(shí)候, 都可以通過 accept 系統(tǒng)調(diào)用讓操作系統(tǒng)接受一個(gè)新的連接, 同時(shí)返回一個(gè)新的socket, 這個(gè)socket 是綁定在(本機(jī)ip,本機(jī)port,對(duì)端ip,對(duì)端port) 這個(gè)上面的, 也就是對(duì)應(yīng)了一個(gè)unique的連接.
然后你可以拿著這個(gè)新產(chǎn)生的socket 進(jìn)行寫入和讀取等操作(因?yàn)樗且粋€(gè)文件描述符). 那個(gè)用來listen的socket 和這個(gè)新的socket 是不相關(guān)的,在操作系統(tǒng)內(nèi)部也是分開的,會(huì)有各自的緩沖區(qū)等.