首頁 >後端開發 >php教程 >php實作socket的方法

php實作socket的方法

小云云
小云云原創
2018-03-31 14:09:525196瀏覽

本文主要和大家分享php實作socket的方法,主要以文字和程式碼的方式和大家分享,希望能幫助大家。

一、Socket 簡介
1、socket只不過是一個資料結構。
2、使用這個socket資料結構去開始一個客戶端和伺服器之間的會話。
3、伺服器是一直在監聽準備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個連接埠進行會話。
4、伺服器端接受客戶端的連線請求,那就進行一次循環。現在這個客戶端就能夠傳送訊息到伺服器,伺服器也能傳送訊息給客戶端。

二、Socket 變數
產生一個Socket,你需要三個變數:一個協定、一個socket類型和一個公共協定類型。

1、協定

查看原始碼複製到剪下板列印說明

  1. #AF_INET  

  2. / /產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的位址  

  3.   

  4. ##//產生socket的協議,使用TCP或UDP來傳輸,用在IPv6的位址  
  5.   
  6. #AF_UNIX  
  7. //本地協議,使用在Unix和Linux系統上,它很少使用,通常是當客戶端和伺服器在同一台機器上的時候使用  
  8. 2、Socket類型
查看原始碼複製到剪下板列印說明

SOCK_STREAM  
  1. # #//這個協定是依照順序的、可靠的、資料完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。

  2.   

  3. SOCK_DGRAM  

  4. //此協定是無連線的、固定長度的傳輸調用。該協定是不可靠的,使用UDP來進行它的連接。

  5.   

  6. SOCK_SEQPACKET  

  7. //這個協定是雙線路的、可靠的連接,發送固定長度的資料包進行傳輸。必須把這個包完整的接受才能進行讀取。

  8.   

  9. SOCK_RAW  

  10. //這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協定。 (ping、traceroute使用此協定)  

  

SOCK_RDM  
  1. #//這個類型是很少使用的,在大部分的作業系統上沒有實現,它是提供給資料鏈結層使用,不保證資料包順序  
  2. 3、公共協定
  3. 查看原始碼複製到剪切板列印幫助

  4. ICMP  

  5. //互聯網控制訊息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤訊息  

  6.   

  7. UDP  

  8. //用戶資料封包協議,它是無連接,不可靠的傳輸協定  

#  



##TCP  






################ ###//傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證資料包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯資料包。 ############三、Socket函數###1、socket_create###作用:產生一個socket,相當於產生一個socket的資料結構###用法:socket_create ( int domain, int type, int protocol )###參數:domain,協定;type,型別;protocol,公共協定###回傳:socket resource on success, or FALSE on error######2、socket_bind###作用:把socket綁定在一個IP位址和連接埠上###用法:socket_bind ( resource socket, string address [, int port] )###參數:socket,socket resource;address,ip位址;port,連接埠####返回:Boolean###

3、socket_accept
作用:接受一個Socket連接
用法:socket_accept ( resource socket )
參數:socket,socket resource
#回傳:Returns a new socket resource on success, or FAL

# on error.


4、socket_connect()
作用:開始一個socket連接
用法:socket_connect ( resource socket, string address [, int port] )
參數:socket,socket resource; address,ip位址;port,連接埠

返回:Boolean


#5、socket_listen
作用:監聽所有由指定socket的連線
用法:socket_listen ( resource socket [, int backlog] )
參數:socket,socket resource;

回傳:Boolean

##6、socket_read
作用:讀取指定長度的資料
用法:socket_read ( resource socket, int length [, int type] )
參數:socket,socket resource;length,字元長度;type,PHP_BINARY_READ |PHP_NORMAL_READ
返回:string

7、socket_write

socket快取
##7、socket_write

#socket快取

socket快取
#用法:socket_write ( resource socket, string buffer [, int length] )
參數:socket,socket resource;buffer,字元;length,字元長度;
回傳:Boolean

#8、 socket_send()

作用:這個函數會傳送資料到已連接的socket
用法:socket_send ( resource socket, string buf, int len, int flags )
參數:socket,socket resource;buf,字元; len,字元長度;
返回:Boolean

9、socket_last_error

作用:取得目前socket的最後錯誤代碼
用法:socket_last_error ( [resource socket] )
參數:socketet ,socket resource;
回傳:int

10、socket_strerror

作用:傳回指定錯誤號碼的詳細錯誤
用法:socket_strerror ( int errno )
參數:errno,socket_last_error no ;
作用:string

11、socket_close

作用:關閉一個socket資源
用法:socket_close ( [resource socket] )
參數:socket,socket resource;
#回傳:null

四、使用說明

確認開啟socket方法
    a、編輯PHP.ini文件,去掉extension=php_sockets.dll 前面的註解:
  1. b、程式碼來載入擴展庫

    查看原始碼複製到剪切板列印幫助
  2. if(!extension_loaded('sockets')) {  
  3.     if(strtoupper(substr(PHP_OS, 0, 3)) == "WIN") {  

        dl#'php_s

##       

#    }else{  


#        dl('sockets.so');  

## 

}  


五、socket程式設計

#1、伺服器端

    功能:
  1. a、初始化一個socket並且開啟一個緩存收發數據。
b、等待連接,一旦產生一個連接,它將列印「Socket connected」在伺服器端的螢幕上。

c、伺服器檢查緩衝區,如果緩衝區裡有數據,它將把數據傳送到連接過來的電腦。

然後它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據裡,並且讓連接的計算機知道這些信息,最後關閉連接。

d、連線關閉後,伺服器又開始處理下一次連線。

查看原始碼複製到剪切板列印幫助

// 获取协议  
$commonProtocol = getprotobyname("tcp");  
  
//产生一个socket  
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);  
  
//把socket绑定在一个IP地址和端口上  
socket_bind($socket, 'localhost', 1337);   
  
//监听由指定socket的所有连接  
socket_listen($socket);  
  
//初始化buffer  
$buffer = "NO DATA";  
while(true) {  
    //接受一个Socket连接  
    $connection = socket_accept($socket);  
    printf("Socket connected\r\n");  
  
    // 检测 buffer  
    if($buffer != ""){  
        printf("Something is in the buffer...sending data...\r\n");  
        //写数据到socket缓存  
        socket_write($connection, $buffer . "\r\n");  
        printf("Wrote to socket\r\n");  
    }else {  
        printf("No Data in the buffer\r\n");  
    }  
  
    //读取指定长度的数据  
    while($data = socket_read($connection, 1024, PHP_NORMAL_READ))  
    {  
        $buffer = $data;  
        //写数据到socket缓存  
        socket_write($connection, "Information Received\r\n");  
        printf("Buffer: " . $buffer . "\r\n");  
    }  
    //关闭一个socket资源  
    socket_close($connection);  
    printf("Closed the socket\r\n\r\n");  
}

  1. #2、客戶端
功能:

a 、客戶端連接到伺服器。客戶端讀取資料。

###b、如果這是第一時間到達這個循環的首次連接,這個伺服器將會發送「NO DATA」回傳給客戶端。如果情況發生了,這個客戶端在連線之上。 ######c、客戶端發送它的資料到伺服器,資料發送給伺服器,客戶端等待回應。一旦接受到回應,那麼它將把回應寫到螢幕上。 ######查看原始碼複製到剪切板列印說明#########
// 创建 socket  
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  
  
//链接 socket  
$connection = socket_connect($socket,'localhost', 1337);  
  
//读取指定长度的数据  
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {  
    if($buffer == "NO DATA") {  
        printf("NO DATA");  
        break;  
    }else{  
        // 输出 buffer  
        printf("Buffer Data: " . $buffer . "");  
    }  
}  
  
printf("Writing to Socket");  
  
//写数据到socket缓存  
if(!socket_write($socket, "SOME DATA\r\n")){  
    printf("Write failed");  
}  
  
//读取指定长度的数据  
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){  
    printf("Data sent was: SOME DATA Response was:" . $buffer . "");  
}  
  
printf("Done Reading from Socket");
##########相關推薦:###

實例詳解php的socket程式

PHP之SOCKET程式設計詳解

php中socket通訊詳解

以上是php實作socket的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn