如何用PHP實作Socket伺服器
本文由碼農網 – 王國峰原創翻譯,轉載請看清文末的轉載要求,歡迎加入技術翻譯小組!
想要建立聊天應用,或甚至是遊戲嗎?那麼,socket伺服器將成為你踏出的第一步。一旦你了解了建立伺服器的基本功能,那麼後續的最佳化步驟就會變得同樣簡單。
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...\r\n"; // 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 $i\r\n"; break; } elseif ($i == $max_clients - 1) echo "Too many clients...\r\n"; } } // 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 $i\r\n"; // Zero length string meaning disconnected unset($client[$i]); } else { echo "New input received $i\r\n"; // 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 $j\r\n"; socket_write($client[$j]['sock'], $input, strlen($input)); } } if ($input == 'exit') { // requested disconnect socket_close($client[$i]['sock']); } } } else { echo "Client disconnected $i\r\n"; // Close the socket socket_close($client[$i]['sock']); unset($client[$i]); } } } } // end while // Close the master sockets socket_close($sock);
啊呀,乍一看這似乎是一個大工程,但是我們可以先將它分解為幾個較小的部分。第一部分是創建伺服器。 Lines:2至20。
這部分程式碼設定了變數、位址、連接埠、最大客戶端和客戶端陣列。接下來建立socket並將其綁定到我們指定的位址和連接埠上。
下面我們要做的事情就是執行一個死循環(實際上我們是故意的!)。 Lines:22至32。在這部分程式碼中我們做的第一步是設定 $read
陣列。此陣列包含所有客戶端的套接字和我們主伺服器的套接字。這個變數稍後會用於select語句:告訴PHP監聽來自這些客戶端的每一則訊息。
socket_select()的最後一個參數告訴我們的伺服器在回傳值之前最多等待5秒鐘。如果它的回傳值小於1,那麼就表示沒有收到任何數據,所以只需要回到循環頂部,繼續等待。
腳本的下一個部分,是增加新的客戶端到陣列中。 Lines:33至44。
將新的客戶端放置在清單的末尾。檢查以確保客戶端的數量沒有超過我們想要伺服器處理的數量。
下面要介紹的程式碼區塊相當大,也是伺服器的主要部分。當客戶端將訊息傳送到伺服器時,就需要這塊程式碼挺身而出處理。訊息可以是各種各樣的,斷開訊息、實際斷開——只要是伺服器需要處理的訊息。 Lines:46至末。
程式碼循環通過每個客戶端並檢查是否收到來自於它們的訊息。如果是,取得輸入的內容。根據輸入來檢查這是否是一個斷開訊息,如果是那就從數組中刪除它們,反之,那它就是一個正常的消息,那我們的伺服器再次通過所有客戶端,並一個一個寫訊息給他們,跳過發送者。
好了,下面試試看創造自己的聊天伺服器吧!
以上就介紹如何用PHP實作Socket伺服器,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

這篇文章為大家帶來了關於php+socket的相關知識,其中主要介紹了IO多路復用,以及php+socket如何實作web伺服器?有興趣的朋友下面一起來看一下,希望對大家有幫助。

一、基於TCP協定的socket套接字程式設計1、套接字工作流程先從伺服器端說起。伺服器端先初始化Socket,然後與連接埠綁定(bind),對連接埠進行監聽(listen),呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化一個Socket,然後連接伺服器(connect),如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端發送資料請求,伺服器端接收請求並處理請求,然後把回應資料傳送給客戶端,客戶端讀取數據,最後關閉連接,一次互動結束,使用以下Python程式碼實作:importso

SpringBoot端第一步,引入依賴首先我們需要引入WebSocket所需的依賴,以及處理輸出格式的依賴com.alibabafastjson1.2.73org.springframework.bootspring-boot-starter-websocket第二步,創建WebSocket配置類importorg. springframework.context.annotation.Bean;importorg.springframework.context.annotation.Config

準備工作用vuecreateexample建立項目,參數大概如下:用原生input原生的input,主要是value和change,資料在change的時候需要同步。 App.tsx如下:import{ref}from'vue';exportdefault{setup(){//username就是資料constusername=ref('張三');//輸入框變化的時候,同步資料constonInput=;return( )=>({

laravel input隱藏域的實作方法:1、找到並開啟Blade模板檔案;2、在Blade模板中使用method_field方法來建立隱藏域,其建立語法為「{{ method_field('DELETE') }}」。

php socket無法連線的解決方法:1、檢查php是否開啟socket擴充;2、開啟php.ini文件,檢查「php_sockets.dll」是否已載入;3、取消「php_sockets.dll」的註解狀態即可。

C#中常見的網路通訊和安全性問題及解決方法在當今互聯網時代,網路通訊已成為了軟體開發中必不可少的一部分。在C#中,我們通常會遇到一些網路通訊的問題,例如資料傳輸的安全性、網路連線的穩定性等。本文將針對C#中常見的網路通訊和安全性問題進行詳細討論,並提供相應的解決方法和程式碼範例。一、網路通訊問題網路連線中斷:網路通訊過程中,可能會出現網路連線的中斷,這會導致

PHP是一種常用的開發語言,可以用來開發各種網頁應用程式。除了常見的HTTP請求和回應以外,PHP也支援透過Socket進行網路通信,實現更靈活和高效的資料互動。本文將介紹PHP如何實作Socket通訊的方法與技巧,並附上具體的程式碼範例。什麼是Socket通訊Socket是一種在網路中進行通訊的方法,可以在不同的電腦之間傳輸資料。透過S
