国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php socket通信機制實例說明與代碼

2024-05-04 21:48:58
字體:
來源:轉載
供稿:網友

一,socket是什么

什么是socket 所謂socket通常也稱作"套接字",用于描述ip地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。說白了就是一種通信機制。它類似于銀行,電信啊這些部分的電話客服部門。你打電話的時候,那邊會分配置一個人回答你的問題,客服部門就相當于socket的服務器端了,你這邊呢就相當于客戶端了,在和你通話結束前,如果有人在想找和你通話的那個說話,是不可能的,因為你在和他通信,當然客服部門的電話交換機也不會重復分配。

下面我將舉例子來說明一下,socket是怎么工作的。如果你是基于應用層開發的人員并不一定要理解原理,但是能知道那是更好了。網上有關于socket的php api。下下來用就行了。

二,socket服務器server.php

  1. <?php  
  2. // 建立server端socket  
  3. $tcp = getprotobyname("tcp");  
  4. $socket = socket_create(af_inet, sock_stream, $tcp);  
  5. socket_bind($socket'127.0.0.1', 10008);       //綁定要監聽的端口  
  6. socket_listen($socket);       //監聽端口 
  7.  
  8. //初始化一個數據,和客戶端通信  
  9. $buffer = "connect";  
  10. while (true) {  
  11.     // 接受一個socket連接  
  12.     $connection = socket_accept($socket);  
  13.     if(!$connection){  
  14.         echo "connect fail";  
  15.     }else{  
  16.             echo  "socket connected ";  
  17.             // 向客戶端傳遞一個信息數據  
  18.             if ($buffer != "") {  
  19.                 echo "send data to client ";  
  20.                 socket_write($connection$buffer . " ");  
  21.                 echo  "wrote to socket ";  
  22.             } else {  
  23.                 echo  "no data in the buffer " ;  
  24.             }  
  25.             // 從客戶端取得信息  
  26.             while ($data = @socket_read($connection, 1024, php_normal_read)) {  
  27.                     printf("buffer: " . $data . " ");  
  28.                     //取得信息給客戶端一個反饋  
  29.                     socket_write($connection"information received ");  
  30.             } //開源代碼Vevb.com 
  31.     } 
  32.  
  33.     socket_close($connection);  
  34.     //關閉 socket  
  35.     printf("closed the socket ");  
  36. }  
  37. ?> 

三,socket客戶端client.php

  1. <?php  
  2. // 建立客戶端的socet連接  
  3. $socket = socket_create(af_inet, sock_stream, sol_tcp);  
  4. $connection = socket_connect($socket'127.0.0.1', 10008);    //連接服務器端socket 
  5.  
  6. while ($buffer = @socket_read($socket, 1024, php_normal_read)) {  
  7.     //服務端告訴客戶端,自己的狀態  
  8.     if (preg_match("/not connect/",$buffer)) {  
  9.         echo "don`t connect ";  
  10.         break;  
  11.     } else {  
  12.         //服務器傳來信息  
  13.         echo "buffer data: " . $buffer . " "
  14.  
  15.         echo "writing to socket ";  
  16.         // 將客戶的信息寫到通道中,傳給服務器端  
  17.         if (!socket_write($socket"some data ")) {  
  18.             echo "write failed ";  
  19.         }  
  20.         //服務器端收到信息后,給于的回應信息  
  21.         while ($buffer = socket_read($socket, 1024, php_normal_read)) {  
  22.                 echo "sent to server: some data response from server was:" . $buffer . " ";  
  23.         } 
  24.  
  25.     }  
  26.  
  27. ?> 

四,通信機制的一個圖片(不考慮等待時間結束自動關閉socket)

簡單說明一下,在說明前我要說一下,為什么要用php命令來執行服務器和客戶端,客戶端你用fsockopen,這樣就在流覽器上訪問了,不至少于會連接超時。為什么會這樣呢,因為你創建一個socket時,它會不斷的去監聽客戶有沒有要來連接。

socket通信的建立要二個socket通道,一個是服務器端創建的,一個是客戶端創建的。

1號線,服務器創建一個socket通道,并將信息放到緩存,等待客戶端連接

2號線,客戶端創建一個socket通道,并連接服務器端,取得服務器端的信息進行通信,將要傳的信息送入通道

3號線,服務器端從客戶端取得信息,并告訴客戶端,信息我已經收到了。將要傳的信息送入通道

4號線,客戶端從服務器端取得確認信息

到此一個通信就完全建立了,數據傳輸完畢后,服務器端會斷開socket通信,具體操作如下.

1,運行socket服務器端

  1. [root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
  2. interactive mode enabled 

這一點做了那些工作呢

a,監聽了一個10008端口

[zhangy@blackghost ~]$ netstat -an |grep listen |grep 10008

tcp        0      0 127.0.0.1:10008    0.0.0.0:*      listen

[zhangy@blackghost ~]$

b,將信息送到緩存里面$buffer = "connect";看上面的代碼

2,運行socket客戶端

  1. [root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/client.php 
  2. interactive mode enabled 
  3.  
  4. buffer data: connect 
  5.  
  6. writing to socket 
  7. sent to server: some data 
  8. response from server was:information received 

3,回到服務器端

  1. [root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
  2. interactive mode enabled 
  3.  
  4. socket connected 
  5. send data to client 
  6. wrote to socket 
  7. buffer: some data 
  8.  
  9. closed the socket

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凭祥市| 扎赉特旗| 昌吉市| 阳西县| 油尖旺区| 资溪县| 雅江县| 错那县| 嘉黎县| 白山市| 万山特区| 驻马店市| 崇文区| 七台河市| 大关县| 高阳县| 治县。| 屏东市| 营口市| 胶南市| 衡南县| 青阳县| 和龙市| 垦利县| 江源县| 大关县| 怀宁县| 阜康市| 瓦房店市| 盐池县| 广昌县| 拉孜县| 乳源| 静宁县| 汾西县| 安新县| 志丹县| 根河市| 渭源县| 东城区| 郯城县|