A. php怎麼創建開啟socket服務
在PHP中創建和開啟socket服務,可以參考以下示例代碼。首先,我們需要創建一個socket伺服器,這通常通過PHP內置的socket相關函數來實現。這里提供一個簡單的示例,幫助理解基本的socket服務搭建過程。
下面是一個基本的PHP socket伺服器示例:
php
$address = '127.0.0.1';
$port = 12345;
$backlog = 5;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}
socket_bind($socket, $address, $port);
if (socket_listen($socket, $backlog) === false) {
echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
echo "Socket server is listening on $address:$port\n";
while (true) {
$client_socket = socket_accept($socket);
if ($client_socket === false) {
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
$client_address = socket_getpeername($client_socket, $client_port);
echo "Connection from $client_address:$client_port\n";
socket_write($client_socket, "Hello from server\n");
socket_close($client_socket);
}
}
socket_close($socket);
在這個示例中,我們創建了一個TCP socket伺服器,監聽本地IP地址127.0.0.1的12345埠。伺服器接受客戶端連接請求,並向每個客戶端發送一條歡迎信息。
運行這個示例代碼後,你可以使用如下的客戶端代碼與伺服器進行通信:
php
$client_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client_socket, '127.0.0.1', 12345);
$response = socket_read($client_socket, 1024);
echo $response;
socket_close($client_socket);
以上示例展示了如何創建一個PHP socket伺服器及其客戶端。通過這些基礎代碼,你可以進一步擴展功能,實現更復雜的服務和客戶端交互。
B. php可不可以socket通信長連接,不斷開,然後實現多次通訊
理論上是可以的,使用PHP提供的socket相關API,主要問題是腳本執行時間。
PHP運行模式分為非命令行模式及命令行模式。
非命令行模式一般是用於B/S交互,max_execution_time默認為非零,也就是限制腳本執行時間。即使你設置max_execution_time為0也面臨用戶瀏覽器請求的超時問題。
命令行模式下set_limit_time默認為0,做為本地腳本執行,所以沒有上述的問題。
PHP SOCKET相關文檔:
http://cn2.php.net/manual/zh/book.sockets.php
C. php涓轟粈涔堜笉閫傚悎socket
浣滀負涓鍚嶉潪搴曞眰紼嬪簭鍛橈紝瑕佹兂娣卞叆浜嗚Вsocket鐨勫唴閮ㄥ疄鐜版満鍒舵槸寰堝洶闅劇殑錛屾垜浠鍙闇鏄庣櫧socket鏄涓濂楁搷浣滅郴緇熷皝瑁呭ソ鐨勫疄鐜拌繘紼嬮氫俊鐨勫嚱鏁幫紝浼氬壋寤哄拰璋冪敤灝卞熶簡銆
PHP鐨勮璦鐗規у拰鑷韜瀹氫綅鍐沖畾浜嗗畠鍙閫傚悎鍋歴ocket瀹㈡埛絝錛岃屼笉閫傚悎鍋歴ocket鏈嶅姟鍣ㄧ銆
鍥犱負socket涓昏侀潰鍚戝簳灞傚拰緗戠粶鏈嶅姟寮鍙戱紝涓鑸鏈嶅姟鍣ㄧ閮芥槸鐢 C 鎴 Java 絳夎璦瀹炵幇錛岃繖鏍瘋兘鏇村ソ鍦版搷浣滃簳灞傦紝瀵圭綉緇滄湇鍔″紑鍙戜腑閬囧埌鐨勯棶棰橈紙濡傚苟鍙戙侀樆濉炵瓑錛変篃鏈夋垚鐔熷畬鍠勭殑瑙e喅鏂規堬紝鑰孭HP鏄劇劧涓嶉傚悎榪欑嶅簲鐢ㄥ満鏅銆 錛堟帹鑽愬︿範錛歅HP瑙嗛戞暀紼嬶級
瀹為檯涓婏紝PHP鎿嶄綔MySQL鏁版嵁搴撲篃鏄閫氳繃socket榪涜岀殑錛岃繖姝f槸鐢變簬socket灞忚斀浜嗗簳灞傜殑鍗忚錛屼嬌寰楃綉緇滄湇鍔′箣闂寸殑浜掕仈浜掗氬彉寰楃畝鍗曘
闄や簡浼犵粺鐨勬湇鍔″櫒絝璇璦瀹炵幇鐨剆ocket澶栵紝闅忕潃HTML5鐨勬祦琛岋紝嫻忚堝櫒瀹㈡埛絝瀹炵幇鐨刉ebSocket涔熼愭笎鍏磋搗錛屽逛簬榪欎竴鐐瑰煎緱鍏蟲敞錛孎lashSocket涔熸槸涓涓涓嶉敊鐨勮В鍐蟲柟妗堛
瑕佸湪瀹㈡埛絝鎿嶄綔socket錛屽彲浣跨敤fsockopen銆乻ocket_create 鎴 stream_socket_client 絳夊嚱鏁板疄鐜幫紝濡傛灉鏄疨HP5錛屾帹鑽愪嬌鐢╯tream_socket_client銆
socket浜や簰搴旂敤瀹炰緥錛氫嬌鐢╯ocket鎻愪氦琛ㄥ崟
鏂板緩涓涓 test.php 鏂囦歡錛屽悜 http://demo.com/index.php?id=1 鎻愪氦琛ㄥ崟鏁版嵁錛屼唬鐮佸備笅錛
<?php
$data = array('comment'=>'this is a robot comment');
$data = http_build_query($data);
$out = "POST http://demo.com/index.php?id=1 HTTP/1.1
"; // 閫氳繃POST鏂瑰紡鍙戦佹暟鎹
$out .= "Host: demo.com
";
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8
";
$out .= "Content-length: ".strlen($data)."
";
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."
";
$out .= "Connection: close"."
"."
"; // 娉ㄦ剰錛氭ゅ勬湁涓や釜
$out .= $data."
"; // 姝f枃鏁版嵁
$fp = fsockopen("demo.com", 80, $errno, $errstr, 30); // 鍒涘緩socket瀹㈡埛絝榪炴帴
// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30); 鎺ㄨ崘榪欑嶅啓娉
fwrite($fp, $out); // 鍚戞湇鍔″櫒鍙戦佹暟鎹
while (!feof($fp)) {
echo fgets($fp, 1280); // 璇誨彇鏈嶅姟鍣ㄥ搷搴旂殑鏁版嵁
}
fclose($fp); // 鍏抽棴socket榪炴帴
?>闇瑕佹敞鎰忎互涓嬪嚑鐐癸細
fsockopen鐨勭涓涓鍙傛暟錛屼篃鍙浠ヤ嬌鐢↖P鍦板潃錛屼笉瑕佸甫 http:// 瀛楃︿覆錛岄櫎闈炰嬌鐢⊿SL絳
璇鋒眰澶達紙headers錛変笉涓瀹氳佸甫涓婃墍鏈夌殑澶村煙錛屼竴鑸鍙闇甯︿笂鍑犱釜鏍稿績鐨刪eader鍗沖彲
鍦ㄦ渶鍚庝竴涓猦eader澶勶紝鍗 Connection 鍚庢湁涓や釜鎹㈣
娉ㄦ剰緙栫爜闂棰
D. 請教php大神,php如何實現點擊頁面上的一個按鈕發送socket的tcp數據
1.參考資料
socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個
包含socket的資源類型,如果沒有成功則返回false。
Socket函數
函數名 描述
函數名 描述
socket_accept() 接受一個Socket連接
socket_bind() 把socket綁定在一個IP地址和埠上
socket_clear_error() 清除socket的錯誤或最後的錯誤代碼
socket_close() 關閉一個socket資源
socket_connect() 開始一個socket連接
socket_create_listen() 在指定埠打開一個socket監聽
socket_create_pair() 產生一對沒有差別的socket到一個數組里
socket_create() 產生一個socket,相當於產生一個socket的數據結構
socket_get_option() 獲取socket選項
socket_getpeername() 獲取遠程類似主機的ip地址
socket_getsockname() 獲取本地socket的ip地址
socket_iovec_add() 添加一個新的向量到一個分散/聚合的數組
socket_iovec_alloc() 這個函數創建一個能夠發送接收讀寫的iovec數據結構
socket_iovec_delete() 刪除一個已分配的iovec
socket_iovec_fetch() 返回指定的iovec資源的數據
socket_iovec_free() 釋放一個iovec資源
socket_iovec_set() 設置iovec的數據新值
socket_last_error() 獲取當前socket的最後錯誤代碼
socket_listen() 監聽由指定socket的所有連接
socket_read() 讀取指定長度的數據
socket_readv() 讀取從分散/聚合數組過來的數據
socket_recv() 從socket里結束數據到緩存
socket_recvfrom() 接受數據從指定的socket,如果沒有指定則默認當前socket
socket_recvmsg() 從iovec里接受消息
socket_select() 多路選擇
socket_send() 這個函數發送數據到已連接的socket
socket_sendmsg() 發送消息到socket
socket_sendto() 發送消息到指定地址的socket
socket_set_block() 在socket里設置為塊模式
socket_set_nonblock() socket里設置為非塊模式
socket_set_option() 設置socket選項
socket_shutdown() 這個函數允許你關閉讀、寫、或指定的socket
socket_strerror() 返回指定錯誤號的周詳錯誤
socket_write() 寫數據到socket緩存
socket_writev() 寫數據到分散/聚合數組
2.代碼:
<?php
$sendStr='30323034033033';//16進制數據
$sendStrArray=str_split(str_replace('','',$sendStr),2);//將16進制數據轉換成兩個一組的數組
$socket=socket_create(AF_INET,SOCK_STREAM,getprotobyname("tcp"));//創建Socket
if(socket_connect($socket,"192.168.1.100",8080)){//連接
for($j=0;$j<count($sendStrArray);$j++){
socket_write($socket,chr(hexdec($sendStrArray[$j])));//逐組數據發送
}
$receiveStr="";
$receiveStr=socket_read($socket,1024,PHP_BINARY_READ);//採用2進制方式接收數據
$receiveStrHex=bin2hex($receiveStr);//將2進制數據轉換成16進制
echo"client:".$receiveStrHex;
}
socket_close($socket);//關閉Socket
?>