Sokcet的初步理解與使用

2021-10-10 15:08:19 字數 2794 閱讀 1440

我之前一直不明白乙個問題(應用層協議是怎麼選擇tcp還是udp傳輸協議的?),最近看了socket好像有點明白了.

我的理解是這樣的,socket是tcp/ip的封裝,tcp/ip本身就是傳輸層協議,管的就是如何傳輸,其實當我們在建立socket套接字的時候(socket_create(af_inet, sock_stream, sol_tcp)),這個sol_tcp其實就是選擇了傳輸層協議是tcp了,那現在又有乙個問題了,socket和http或者websocket協議有啥關係呢,其實這些協議的底層用的都是socket

那socket是個啥東東呢?看兩張我們就能知道了

tcp/ip是傳輸層協議,主要解決資料如何在網路中傳輸;而http是應用層協議,主要解決如何包裝資料。

socket是對tcp/ip協議的封裝,socket本身並不是協議,而是乙個呼叫介面(api),通過socket,我們才能使用tcp/ip協議。

我用php初步演示一下

$socket

=socket_create

(af_inet

,sock_stream

,sol_tcp);

socket_bind

($socket

,'0.0.0.0'

,8888);

socket_listen

($socket);

$accept

=socket_accept

($socket);

$data

=socket_read

($accept

,'1024');

echo

$data

;

$socket

=socket_create

(af_inet

,sock_stream

,sol_tcp);

socket_connect

($socket

,'127.0.0.1'

,8888);

socket_write

($socket

,'服務端'

);

上面的最簡單的實現了一下sokect,但是當我們用cli的形式去使用時,會出現個問題,第乙個問題,當我執行一次client,客戶端和服務端就自動關閉了,這要咋解決呢,其實這個也簡單,閒話少說,上**
<?php 

// client.php

$socket

=socket_create

(af_inet

,sock_stream

,sol_tcp);

socket_connect

($socket

,'127.0.0.1'

,8888);

while

(true

)

<?php 

$socket

=socket_create

(af_inet

,sock_stream

,sol_tcp);

socket_bind

($socket

,'0.0.0.0'

,8888);

socket_listen

($socket);

while

(true

)}

上面的兩段**就解決了問題,乙個客戶端連線乙個服務端,客戶端可以傳送任意資料,讓服務端接收,服務端也會返回資料,但是又出現了乙個問題,如果我開啟多個客戶端給服務端傳送訊息,那服務端就只能處理第乙個了,那我們接下來要處理現在的問題了,怎麼才能讓多個客戶端連線服務端,正常的傳送訊息呢?
<?php 

// client.php

$socket

=socket_create

(af_inet

,sock_stream

,sol_tcp);

socket_connect

($socket

,'127.0.0.1'

,8888);

while

(true

)

<?php 

// service.php

$socket

=socket_create

(af_inet

,sock_stream

,sol_tcp);

socket_bind

($socket

,'0.0.0.0'

,8888);

socket_listen

($socket);

$sockets

=$socket

;$write

=null

;$except

=null

;while

(true

)else

}}

其實這裡主要就用了socket_select 這個select是個啥東西呢,就是apache的那個io多路復用這個機制,看官可以自己測試一下,多開幾個client,然後看一下service可不可以接受數

物件與物件的關係初步理解

類圖中的六種關係 類圖中,類與類之間一般會有六種關係,他們分別是繼承 generalization 實現 implements 組合 composition 聚合 aggressgation 依賴 dependency 關聯 association 繼承 generalization 在這裡teac...

初步理解容器和安裝使用

docker 是乙個用於開發,交付和執行應用程式的開放平台。docker 使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。借助 docker,您可以與管理應用程式相同的方式來管理基礎架構。通過利用 docker 的方法來快速交付,測試和部署 您可以大大減少編寫 和在生產環境中執行 之間的延遲...

Winsock的IOCP的初步應用與理解

winsock最主要的功能基於socket套接字,現在學得還不是特明白,有個初步的大概認識,通過同步非同步io方式,適用於不同的網路,現在主要提出幾個winsock的關鍵點。在定義sockaddr in位址結構時,有個位址家族主要注意下,sin family這個位址家族可以用兩個巨集來定義,乙個af...