php連接socket
Ⅰ 什麼是socketphp如何實現socket通信
網路上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。
建立網路通信連接至少要一對埠號(socket)。socket本質是編程介面(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網路開發所用的介面,這就是Socket編程介面;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網路通信的能力。
PHP在socket開發上不是很給力,可以考慮使用workerman~
Ⅱ php 怎麼使用socket
php有個擴展 curl 開啟後就能用了
一般用於採集
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 『』);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
大致代碼這樣的,
具體用法看看手冊就知道了
Ⅲ php要讓伺服器使用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... ";
// 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 ";
break;
}
elseif ($i == $max_clients - 1)
echo "Too many clients... ";
}
} // 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 ";
// Zero length string meaning disconnected
unset($client[$i]);
} else {
echo "New input received $i ";
// 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 ";
socket_write($client[$j]['sock'], $input, strlen($input));
}
}
if ($input == 'exit') {
// requested disconnect
socket_close($client[$i]['sock']);
}
}
} else {
echo "Client disconnected $i ";
// 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伺服器
因為只有調用了accept客戶端才能連上,你如果accept下面接一個循環,那麼第二個用戶不是說能不能進這個循環,而是連不進……此時只有第一個用戶break出了循環,然後程序回頭再調用accept,第二個用戶才能連上。
用多進程來處理如何?因為accept一個客戶端以後,應該是馬上准備accept下一個客戶端才對,而不是處理完現在這個客戶端才accept下一個客戶端。
socket_accept以後,直接調用 pcntl_fork(),此時進程會分裂為兩個,其中一個的pnctl_fork返回值是0,另一個不是0。不是0的那個直接繼續調用socket_accept即可,是0的那個處理客戶端請求。
pnctl_fork不知道在windows下能不能用。
不過返回不是0的那個進程並不是這樣就完事了,還要調用pcntl_wait防止子進程卡在那邊沒有完全結束。你可以在主進程里時不時就調用這個,配上WNOHANG作為option參數防止沒有子進程需要wait的時候卡在那邊。
這都是linux下常用的處理手段。說實話本來我想讓你用多線程的,不過看了一圈不知道php里怎麼用線程,倒是找到了用進程的方式,所以就
Ⅳ 想問下php的socket的工作流程是什麼
PHP 使用Berkley的socket庫來創建它的連接。你可以知道socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽准備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個埠進行會話。這時,伺服器端接受客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也能發送信息給客戶端。
產生一個Socket,你需要三個變數:一個協議、一個socket類型和一個公共協議類型。產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。
定義一個公共的協議類型是進行連接一個必不可少的元素。下面的表我們看看有那些公共的協議類型。
表一:協議
名字/常量 描述
AF_INET 這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址
AF_INET6 與上面類似,不過是來用在IPv6的地址
AF_UNIX 本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用
表二:Socket類型
名字/常量 描述
SOCK_STREAM 這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
SOCK_DGRAM 這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。
SOCK_SEQPACKET 這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。
SOCK_RAW 這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)
SOCK_RDM 這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序
表三:公共協議
名字/常量 描述
ICMP 互聯網控制消息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤信息
UDP 用戶數據報文協議,它是一個無連接,不可靠的傳輸協議
TCP 傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據包。
現在你知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個 socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個包含socket的資源類型,如果沒有成功則返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);
現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。
<?php
$commonProtocol = getprotobyname(「tcp」);
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 『localhost』, 1337);
socket_listen($socket);
// More socket functionality to come
?>
上面這個例子產生一個你自己的伺服器端。例子第一行,
$commonProtocol = getprotobyname(「tcp」);
使用公共協議名字來獲取一個協議類型。在這里使用的是TCP公共協議,如果你想使用UDP或者ICMP協議,那麼你應該把getprotobyname() 函數的參數改為「udp」或「icmp」。還有一個可選的辦法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在 socket_create()函數中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是產生一個socket並且返回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP地址和某一個埠上。
Ⅵ php可不可以socket通信長連接,不斷開,然後實現多次通訊
當然可以,我都已經做過udp socket雲端門禁管理系統,伺服器socket監控設備連接狀態,設備通過發送心跳包來維持連接,從而實現長連接,更多詳情http://www.100txy.com/article/54.html
Ⅶ php socket長連接是使用死循環來做嗎
所謂長連接,指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需
要雙方發檢測包以維持此連接。短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成後,則斷開此TCP連接,即每次TCP連接只完成一對
CMPP消息的發送。
現階段,要求ISMG之間必須採用長連接的通信方式,建議SP與ISMG之間採用長連接的通信方式。短連接:比如http的,只是連接、請求、關閉,過程時間較短,伺服器若是一段時間內沒有收到請求即可關閉連接。長連接:有些服務需要長時間連接到伺服器,比如CMPP,一般需要自己做在線維持。
Ⅷ php socket 與c socket怎麼連接
SOCKET是TCP/IP協議開發API,譬如C/S架構的TCP協議,其伺服器(帶有偵聽sokect)與客戶端通訊,原則上與雙方所採用的編程語言無關。你可以試試,用C語言寫一個伺服器程序,然後客戶端用php來寫,但雙方發送的數據格式要約定好。最簡單的是客戶端與伺服器方連接一下試試,伺服器方定有反應。當然,兩台計算機之間至少要PING通IP地址。
Ⅸ 如何用PHP實現Socket伺服器
因為只有調用了accept客戶端才能連上,你如果accept下面接一個循環,那麼第二個用戶不是說能不能進這個循環,而是連不進……此時只有第一個用戶break出了循環,然後程序回頭再調用accept,第二個用戶才能連上。
用多進程來處理如何?因為accept一個客戶端以後,應該是馬上准備accept下一個客戶端才對,而不是處理完現在這個客戶端才accept下一個客戶端。
socket_accept以後,直接調用
pcntl_fork(),此時進程會分裂為兩個,其中一個的pnctl_fork返回值是0,另一個不是0。不是0的那個直接繼續調用socket_accept即可,是0的那個處理客戶端請求。
pnctl_fork不知道在windows下能不能用。
不過返回不是0的那個進程並不是這樣就完事了,還要調用pcntl_wait防止子進程卡在那邊沒有完全結束。你可以在主進程里時不時就調用這個,配上WNOHANG作為option參數防止沒有子進程需要wait的時候卡在那邊。
這都是linux下常用的處理手段。說實話本來我想讓你用多線程的,不過看了一圈不知道php里怎麼用線程,倒是找到了用進程的方式,所以就
Ⅹ php socket 客戶端長連接
把socket句柄保存下來
$accept = socket_accept( $v )