成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? 利用PHP如何實現Socket服務器
全站頭部文字 我要出現在這里
利用PHP如何實現Socket服務器 838 2023-12-08   

socket服務器的工作方式是這樣的,不間斷地運行以等待客戶端的連接。一旦客戶端連接上了,服務器就會將它添加到客戶名單中,然后開始等待來自客戶端的消息。

查看圖片

不要走開,下面是完整的源代碼:

// Set time limit to indefinite execution 
set_time_limit (0); 
 
// Set the ip and port we will listen on 
$address = 'localhost'; 
$port = 10000; 
$max_clients = 10; 
 
// Array that will hold client information 
$client = Array(); 
 
// Create a TCP Stream socket 
$sock = socket_create(AF_INET, SOCK_STREAM, 0); 
// Bind the socket to an address/port 
socket_bind($sock, $address, $port) or die('Could not bind to address'); 
// Start listening for connections 
socket_listen($sock); 
 
echo "Waiting for connections...rn"; 
 
// Loop continuously 
while (true) { 
// Setup clients listen socket for reading 
$read[0] = $sock; 
for ($i = 0; $i < $max_clients; $i++) { 
 if (isset($client[$i]['sock'])) 
  $read[$i + 1] = $client[$i]['sock']; 
} 
// Set up a blocking call to socket_select() 
if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1) 
 continue; 
/* if a new connection is being made add it to the client array */ 
if (in_array($sock, $read)) { 
 for ($i = 0; $i < $max_clients; $i++) { 
  if (empty($client[$i]['sock'])) { 
  $client[$i]['sock'] = socket_accept($sock); 
  echo "New client connected $irn"; 
  break; 
  } 
  elseif ($i == $max_clients - 1) 
  echo "Too many clients...rn"; 
 } 
} // end if in_array 
 
// If a client is trying to write - handle it now 
for ($i = 0; $i < $max_clients; $i++) { // for each client 
 if (isset($client[$i]['sock'])) { 
  if (in_array($client[$i]['sock'], $read)) { 
  $input = socket_read($client[$i]['sock'], 1024); 
  if ($input == null) { 
   echo "Client disconnecting $irn"; 
   // Zero length string meaning disconnected 
   unset($client[$i]); 
  } else { 
   echo "New input received $irn"; 
   // send it to the other clients 
   for ($j = 0; $j < $max_clients; $j++) { 
   if (isset($client[$j]['sock']) && $j != $i) { 
    echo "Writing '$input' to client $jrn"; 
    socket_write($client[$j]['sock'], $input, strlen($input)); 
   } 
   } 
   if ($input == 'exit') { 
   // requested disconnect 
   socket_close($client[$i]['sock']); 
   } 
  } 
  } else { 
  echo "Client disconnected $irn"; 
  // Close the socket 
  socket_close($client[$i]['sock']); 
  unset($client[$i]); 
  } 
 } 
} 
} // end while 
// Close the master sockets 
socket_close($sock); 

哎呀,乍一看這似乎是一個大工程,但是我們可以先將它分解為幾個較小的部分。

第一部分是創建服務器。Lines:2至20。

這部分代碼設置了變量、地址、端口、最大客戶端和客戶端數組。接下來創建socket并將其綁定到我們指定的地址和端口上。

下面我們要做的事情就是執行一個死循環(實際上我們是故意的?。ines:22至32。

在這部分代碼中我們做的第一步是設置 $read 數組。此數 組包含所有客戶端的套接字和我們主服務器的套接字。這個變量稍后會用于select語句:告訴PHP監聽來自這些客戶端的每一條消息。

socket_select()的最后一個參數告訴我們的服務器在返回值之前最多等待5秒鐘。如果它的返回值小于1,那么就表示沒有收到任何數據,所以只需要返回循環頂部,繼續等待。

腳本的下一個部分,是增加新的客戶端到數組中。Lines:33至44。

將新的客戶端放置在列表的末尾。檢查以確??蛻舳说臄盗繘]有超過我們想要服務器處理的數量。

下面要介紹的代碼塊相當大,也是服務器的主要部分。當客戶端將消息發送到服務器時,就需要這塊代碼挺身而出來處理。消息可以是各種各樣的,斷開消息、實際斷開——只要是服務器需要處理的消息。Lines:46至末尾。

代碼循環通過每個客戶端并檢查是否收到來自于它們的消息。如果是,獲取輸入的內容。根據輸入來檢查這是否是一個斷開消息,如果是那就從數組中刪除它們,反之,那它就是一個正常的消息,那我們的服務器再次通過所有客戶端,并一個一個寫信息給他們,跳過發送者。

好了,下面試試創造你自己的聊天服務器吧!


主站蜘蛛池模板: 水咲ローラ| 奇爱博士| 我家来了个怪男人| 天津电视台体育频道节目单| 爱欲1990未删减版播放| 以下关于宏病毒说法正确的是| 姐妹五| 循环小数除法50道| 扩内需| 珠江电视台直播 珠江频道| 大国崛起思维导图| 金珠电影| 小姐诱心在线观看| 崔哲浩| mind and hand| 王盼盼| 麦兆辉| 美丽的坏女人中文字幕| 女生操| 洛兵| 山东卫视体育频道| 最可爱的人 电影| 报团云南旅游价格| 国家宝藏之觐天宝匣 电视剧| 张柏芝艳照无删减版| 啊啊操| 女总裁电视剧大结局| 凤凰卫视资讯台直播| 我在等你泰剧剧情介绍| 职业兽医医生资格证报名官网| 汤姆·塞兹摩尔| 妈妈的脊背简谱| 艳女十八式无删减版| 黄真伊| 萱草花二声部合唱谱| 小矮人的一级毛片| 通灵之王| 电影《48天》免费观看全集| 感冒难受的图片| 王小凤| 成人免费视频观看视频|

?。?!站長長期在線接?。?!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103