這篇文章主要介紹了php簡單socket伺服器用戶端代碼執行個體,本文給出了兩個版本的伺服器連接埠,對代碼的問題和改進做了說明,並給出了使用這個socket伺服器的用戶端代碼,需要的朋友可以參考下
本篇文章分享一個簡單的socket樣本,用php。實現一個接收輸入字串,處理並返回這個字串到用戶端的TCP服務。
產生一個 socket 服務端
<?php/*檔案名稱:socket_server.php*/// 設定一些基本的變數$host="127.0.0.1";//Socket啟動並執行伺服器的IP地址$port=1234;//Socket啟動並執行伺服器的連接埠,連接埠取值為1到65535之間的數字,前提是這個連接埠未被使用// 設定逾時時間,這裡設定為永不逾時,確保PHP在等待用戶端串連時不會逾時。set_time_limit(0);// 建立一個Socket,返回一個Socket控制代碼$socket=socket_create(AF_INET,SOCK_STREAM,0) or die("Could not create socket\n");//綁定Socket到指定的地址和連接埠$result=socket_bind($socket,$host,$port) or die("Could not bind to socket\n");// 開始監聽外部串連$result=socket_listen($socket,3) or die("Could not set up socket listener\n");/******到這裡,伺服器除了等待來自用戶端的串連請求外基本上什麼也不做******/// 另一個Socket來處理服務端與用戶端的通訊$spawn=socket_accept($socket) or die("Could not accept incoming connection\n");// 讀取用戶端的輸入,當一個串連被建立後,伺服器就會等待用戶端發送一些輸入資訊,這些資訊可以由socket_read()函數來獲得,並把它賦值給PHP的$input變數$input=socket_read($spawn,1024) or die("Could not read input\n");//socker_read的第二個參數用以指定讀入的位元組數,你可以通過它來限制從用戶端擷取資料的大小// 下面這不就不解釋了,不知道的自己面壁去$input=trim($input);//處理用戶端輸入並返回結果,當用戶端發來資料資訊後,資訊輸出就要靠socket_write()函數來完成$output=strrev($input) ."\n";//反轉字串,這裡僅僅是為了更好的區分兩條資訊socket_write($spawn,$output,strlen($output)) or die("Could not write output\n");// 關閉socketssocket_close($spawn);socket_close($socket);
提示:你應該使用你的命令提示字元來運行上面這段代碼。理由是因為這裡將產生一個伺服器,而不是一個Web頁面。如果你嘗試使用Web瀏覽器來運行這個指令碼,那麼很有可能它會超過30秒的限時。你可以使用下面的代碼來設定一個無限的已耗用時間,但是還是建議使用命令提示字元來運行。
代碼如下:
set_time_limit(0);
在你的命令提示字元中對這個指令碼進行簡單測試:
代碼如下:
Php.exe socket_server.php
如果你沒有在系統的環境變數中設定php解譯器的路徑,那麼你將需要給php.exe指定詳細的路徑。當你運行這個伺服器端的時候,你能夠通過遠程登陸(telnet)的方式串連到連接埠1337來測試這個伺服器。
上面的伺服器端有三個問題:
1. 它不能接受多個串連。
2. 它只完成唯一的一個命令。
3. 你不能通過Web瀏覽器串連這個伺服器。
這個第一個問題比較容易解決,你可以使用一個應用程式去每次都串連到伺服器。但是後面的問題是你需要使用一個Web頁面去串連這個伺服器,這個比較困難。你可以讓你的伺服器接受串連,然後些資料到用戶端(如果它一定要寫的話),關閉串連並且等待下一個串連。
在上一個代碼的基礎上再改進,產生下面的代碼來做你的新伺服器端:
<?php$commonProtocol = getprotobyname("tcp");$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);socket_bind($socket, 'localhost', 1337); //socket_bind() 把socket綁定在一個IP地址和連接埠上socket_listen($socket);$buffer = "NO DATA";while(true) { // Accept any connections coming in on this socket $connection = socket_accept($socket);//socket_accept() 接受一個Socket串連 printf("Socket connected\r\n"); // Check to see if there is anything in the buffer if($buffer != ""){ printf("Something is in the buffer...sending data...\r\n"); socket_write($connection, $buffer . "\r\n"); //socket_write() 寫資料到socket緩衝 printf("Wrote to socket\r\n"); }else { printf("No Data in the buffer\r\n"); } // Get the input while($data = socket_read($connection, 1024, PHP_NORMAL_READ)){//socket_read() 讀取指定長度的資料 $buffer = $data; socket_write($connection, "Information Received\r\n"); printf("Buffer: " . $buffer . "\r\n"); } socket_close($connection); //socket_close() 關閉一個socket資源 printf("Closed the socket\r\n\r\n");}
這個伺服器端要做什麼呢?它初始化一個socket並且開啟一個緩衝收發資料。它等待串連,一旦產生一個串連,它將列印“Socket connected”在伺服器端的螢幕上。這個伺服器檢查緩衝區,如果緩衝區裡有資料,它將把資料發送到串連過來的電腦。然後它發送這個資料的接受資訊,一旦它接受了資訊,就把資訊儲存到資料裡,並且讓串連的電腦知道這些資訊,最後關閉串連。當串連關閉後,伺服器又開始處理下一次串連。
產生一個 socket 用戶端
處理第二個問題是很容易的。你需要產生一個php頁串連一個socket,發送一些資料進它的緩衝並處理它。然後你有個處理後的資料在還頓,你能夠發送你的資料到伺服器。在另外一台用戶端串連,它將處理那些資料。
下面的例子示範了使用socket:
<?php// Create the socket and connect$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);$connection = socket_connect($socket,'localhost', 1337);while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) { if($buffer == "NO DATA") { echo("<p>NO DATA</p>"); break; }else{ // Do something with the data in the buffer echo("<p>Buffer Data: " . $buffer . "</p>"); }}echo("<p>Writing to Socket</p>");// Write some test data to our socketif(!socket_write($socket, "SOME DATA\r\n")){ echo("<p>Write failed</p>");}// Read any response from the socket phpernote.comwhile($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){ echo("<p>Data sent was: SOME DATA<br> Response was:" . $buffer . "</p>");}echo("<p>Done Reading from Socket</p>");
這個例子的代碼示範了用戶端串連到伺服器。用戶端讀取資料。如果這是第一時間到達這個迴圈的首次串連,這個伺服器將發送“NO DATA”返回給用戶端。如果情況發生了,這個用戶端在串連之上。用戶端發送它的資料到伺服器,資料發送給伺服器,用戶端等待響應。一旦接受到響應,那麼它將把響應寫到螢幕上。