導航:首頁 > 編程語言 > phpsocket文件上傳

phpsocket文件上傳

發布時間:2024-06-23 01:20:08

A. 奼侾HP SOCKET緙栫▼鍘熺悊

浣犱簡瑙d粈涔堟槸socket涓?
濡傛灉涓嶄簡瑙e緩璁鍘諱簡瑙d笅,閮芥槸闇瑕佹帉鎻$殑鐭ヨ瘑

鎴戝ぇ姒傝窡浣犳弿榪頒笅嫻佺▼

鏈嶅姟鍣ㄧ鍏堝垵濮嬪寲Socket錛岀粦瀹氱鍙(bind)錛屽圭鍙h繘琛岀洃鍚(listen)錛岃皟鐢╝ccept闃誨烇紝絳夊緟瀹㈡埛絝榪炴帴銆
瀹㈡埛絝鍒濆嬪寲涓涓猄ocket錛岀劧鍚庤繛鎺ユ湇鍔″櫒(connect)錛屽傛灉榪炴帴鎴愬姛錛岃繖鏃跺㈡埛絝涓庢湇鍔″櫒絝鐨勮繛鎺ュ氨寤虹珛浜嗐傚㈡埛絝鍙戦佹暟鎹璇鋒眰錛屾湇鍔″櫒絝鎺ユ敹璇鋒眰騫跺勭悊璇鋒眰錛岀劧鍚庢妸鍥炲簲鏁版嵁鍙戦佺粰瀹㈡埛絝錛屽㈡埛絝璇誨彇鏁版嵁錛屾渶鍚庡叧闂榪炴帴錛屼竴嬈′氦浜掔粨鏉熴

鍏跺疄緗戜笂璧勬簮寰堝氫簡, 澶氫簡瑙e氬姩鎵嬪氫綘鑷宸辯殑榪涙ユ湁寰堝ぇ鐨勫府鍔

B. php socket 如何實現非阻塞

關於socket的阻塞與非阻塞模式以及它們之間的優缺點,這已經沒什麼可言的;我打個很簡單的比方,如果你調用socket send函數時;
如果是阻塞模式下:
send先比較待發送數據的長度len和套接字s的發送緩沖的長度,如果len大於s的發送緩沖區的長度,該函數返回SOCKET_ERROR;如果len小於或者等於s的發送緩沖區的長度,那麼send先檢查協議是否正在發送s的發送緩沖中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送s的發送緩沖中的數據或者s的發送緩沖中沒有數據,那麼 send就比較s的發送緩沖區的剩餘空間和len,如果len大於剩餘空間大小,send就一直等待協議把s的發送緩沖中的數據發送完,如果len小於剩餘空間大小send就僅僅把buf中的數據到剩餘空間里
如果是非阻塞模式下:
在調用socket send函數時,如果能寫到socket緩沖區時,就寫數據並返回實際寫的位元組數目,當然這個返回的實際值可能比你所要寫的數據長度要小些(On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server computers),如果不可寫的話,就直接返回SOCKET_ERROR了,所以沒有等待的過程。。
經過上面的介紹後,下面介紹如何設置socket的非阻塞模式:
當使用socket()函數和WSASocket()函數創建套接字時,默認都是阻塞的。在創建套接字之後,通過調用ioctlsocket()函數,將該套接字設置為非阻塞模式。
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.
u_long iMode = 1; //non-blocking mode is enabled.
ioctlsocket(m_socket, FIONBIO, &iMode); //設置為非阻塞模式

套接字設置為非阻塞模式後,在調用Windows Sockets API函數時,調用函數會立即返回。大多數情況下,這些函數調用都會調用「失敗」,並返回WSAEWOULDBLOCK錯誤代碼。說明請求的操作在調用期間內沒有時間完成。通常,應用程序需要重復調用該函數,直到獲得成功返回代碼。 不同的Windows Sockets API函數,在調用失敗時返回的WSAEWOULDBLOCK錯誤代碼具有不同的含義
需要說明的是並非所有的 Windows Sockets API 在非阻塞模式下調用,都會返回 WSAEWOULDBLOCK 錯誤。例如,以非阻塞模式的套接字為參數調用 bind() 函數時,就不會返回該錯誤代碼。當然,在調用 WSAStartup() 函數時更不會返回該錯誤代碼,因為該函數是應用程序第一調用的函數,當然不會返回這樣的錯誤代碼。
要將套接字設置為非阻塞模式,除了使用 ioctlsocket() 函數之外,還可以使用 WSAAsyncselect() 和 WSAEventselect() 函數。當調用該函數時,套接字會自動地設置為非阻塞方式:

C. socket在php主要是什麼作用用在哪些方面

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地址和某一個埠上。
socket_bind($socket, 『localhost』, 1337);
在這里你綁定socket到本地計算機(127.0.0.1)和綁定socket到你的1337埠。然後你就需要監聽所有進來的socket連接。
socket_listen($socket);
在第四行以後,你就需要了解所有的socket函數和他們的使用。

表四: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() 寫數據到分散/聚合數組

(注: 函數介紹刪減了部分原文內容,函數詳細使用建議參考英文原文,或者參考PHP手冊)

以上所有的函數都是PHP中關於socket的,使用這些函數,你必須把你的socket打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋:
extension=php_sockets.dll
如果你無法去掉注釋,那麼請使用下面的代碼來載入擴展庫:
<?php
if(!extension_loaded(『sockets』))
{
if(strtoupper(substr(PHP_OS, 3)) == 「WIN」)
{
dl(『php_sockets.dll』);
}
else
{
dl(『sockets.so』);
}
}
?>

如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。如下圖:

查看phpinfo()關於socket的信息

◆產生一個伺服器

現在我們把第一個例子進行完善。你需要監聽一個指定的socket並且處理用戶的連接。

<?php
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Accept any incoming connections to the server
$connection = socket_accept($socket);
if($connection)
{
socket_write($connection, "You have connected to the socket.../n/r");
}
?>

你應該使用你的命令提示符來運行這個例子。理由是因為這里將產生一個伺服器,而不是一個Web頁面。如果你嘗試使用Web瀏覽器來運行這個腳本,那麼很有可能它會超過30秒的限時。你可以使用下面的代碼來設置一個無限的運行時間,但是還是建議使用命令提示符來運行。
set_time_limit(0);
在你的命令提示符中對這個腳本進行簡單測試:
Php.exe example01_server.php
如果你沒有在系統的環境變數中設置php解釋器的路徑,那麼你將需要給php.exe指定詳細的路徑。當你運行這個伺服器端的時候,你能夠通過遠程登陸(telnet)的方式連接到埠1337來測試這個伺服器。如下圖:

上面的伺服器端有三個問題:1. 它不能接受多個連接。2. 它只完成唯一的一個命令。3. 你不能通過Web瀏覽器連接這個伺服器。
這個第一個問題比較容易解決,你可以使用一個應用程序去每次都連接到伺服器。但是後面的問題是你需要使用一個Web頁面去連接這個伺服器,這個比較困難。你可以讓你的伺服器接受連接,然後些數據到客戶端(如果它一定要寫的話),關閉連接並且等待下一個連接。
在上一個代碼的基礎上再改進,產生下面的代碼來做你的新伺服器端:

<?php
// Set up our socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Initialize the buffer
$buffer = "NO DATA";
while(true)
{
// Accept any connections coming in on this socket

$connection = 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");
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))
{
$buffer = $data;
socket_write($connection, "Information Received/r/n");
printf("Buffer: " . $buffer . "/r/n");
}
socket_close($connection);
printf("Closed the socket/r/n/r/n");
}
?>

這個伺服器端要做什麼呢?它初始化一個socket並且打開一個緩存收發數據。它等待連接,一旦產生一個連接,它將列印「Socket connected」在伺服器端的屏幕上。這個伺服器檢查緩沖區,如果緩沖區里有數據,它將把數據發送到連接過來的計算機。然後它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據里,並且讓連接的計算機知道這些信息,最後關閉連接。當連接關閉後,伺服器又開始處理下一次連接。(翻譯的爛,附上原文)
This is what the server does. It initializes the socket and the buffer that you use to receive
and send data. Then it waits for a connection. Once a connection is created it prints
「Socket connected」 to the screen the server is running on. The server then checks to see if
there is anything in the buffer; if there is, it sends the data to the connected computer.
After it sends the data it waits to receive information. Once it receives information it stores
it in the data, lets the connected computer know that it has received the information, and
then closes the connection. After the connection is closed, the server starts the whole
process again.

◆產生一個客戶端

處理第二個問題是很容易的。你需要產生一個php頁連接一個socket,發送一些數據進它的緩存並處理它。然後你又個處理後的數據在還頓,你能夠發送你的數據到伺服器。在另外一台客戶端連接,它將處理那些數據。
To solve the second problem is very easy. You need to create a PHP page that connects to
a socket, receive any data that is in the buffer, and process it. After you have processed the
data in the buffer you can send your data to the server. When another client connects, it
will process the data you sent and the client will send more data back to the server.

下面的例子示範了使用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 socket
if(!socket_write($socket, 「SOME DATA/r/n」))
{
echo(「<p>Write failed</p>」);
}
// Read any response from the socket
while($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」返回給客戶端。如果情況發生了,這個客戶端在連接之上。客戶端發送它的數據到伺服器,數據發送給伺服器,客戶端等待響應。一旦接受到響應,那麼它將把響應寫到屏幕上。

D. 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 鍚庢湁涓や釜鎹㈣
娉ㄦ剰緙栫爜闂棰

E. PHPSocket緙栫▼榪囩▼

PHP錛孲ocket緙栫▼榪囩▼寰堝氫漢榪樹笉鐭ラ亾錛岀幇鍦ㄨ╂垜浠涓璧鋒潵鐪嬬湅鍚э紒
PHP Socket緙栫▼榪囩▼
銆銆Socket鐢ㄤ簬榪涚▼闂撮氫俊錛岃繘紼嬮棿閫氫俊閫氬父鍩轟簬瀹㈡埛絝鈥旀湇鍔$妯″瀷銆傛ゆ椂錛屽㈡埛絝鈥旀湇鍔$鏄鍙浠ュ郊姝や氦浜掔殑搴旂敤紼嬪簭銆傚㈡埛絝鍜屾湇鍔$涔嬮棿鐨勪氦浜掗渶瑕佽繛鎺ャ係ocket緙栫▼璐熻矗鐨勫氨鏄涓哄簲鐢ㄧ▼搴忎箣闂村緩絝嬪彲榪涜屼氦浜掔殑榪炴帴銆備笅闈涓哄ぇ瀹朵粙緇嶄竴涓婸HP Socket緙栫▼榪囩▼!
銆銆浣跨敤浠g爜
銆銆鐩鐨'錛氬紑鍙戜竴涓瀹㈡埛絝鐢ㄤ簬鍙戦乻tring娑堟伅鍒版湇鍔$錛屾湇鍔$灝嗙浉鍚岀殑淇℃伅鍙嶈漿鍚庤繑鍥炵粰瀹㈡埛絝銆
銆銆PHP鏈嶅姟鍣
銆銆絎1姝ワ細璁劇疆鍙橀噺錛屽傗滀富鏈衡濆拰鈥滅鍙b
銆銆$host = "127.0.0.1";$port = 5353;// No Timeout set_time_limit(0);
銆銆絝鍙e彿鍙浠ユ槸1024 -65535涔嬮棿鐨勪換浣曟f暣鏁般
銆銆絎2姝ワ細鍒涘緩socket
銆銆$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socketn");
銆銆絎3姝ワ細緇戝畾socket鍒扮鍙e拰涓繪満
銆銆鍒涘緩鐨剆ocket璧勬簮緇戝畾鍒癐P鍦板潃鍜岀鍙e彿銆
銆銆$result = socket_bind($socket, $host, $port) or die("Could not bind to socketn");
銆銆絎4姝ワ細鍚鍔╯ocket鐩戝惉
銆銆鍦ㄧ粦瀹氬埌IP鍜岀鍙e悗錛屾湇鍔$寮濮嬬瓑寰呭㈡埛絝鐨勮繛鎺ャ傚湪娌℃湁榪炴帴涔嬪墠瀹冨氨涓鐩寸瓑涓嬪幓銆
銆銆$result = socket_listen($socket, 3) or die("Could not set up socket listenern");
銆銆絎5姝ワ細鎺ュ彈榪炴帴
銆銆榪欎釜鍑芥暟浼氭帴鍙楁墍寤虹殑socket浼犲叆鐨勮繛鎺ヨ鋒眰銆傚湪鎺ュ彈鏉ヨ嚜瀹㈡埛絝痵ocket鐨勮繛鎺ュ悗錛岃ュ嚱鏁拌繑鍥炲彟涓涓猻ocket璧勬簮錛屽疄闄呬笂灝辨槸璐熻矗涓庣浉搴旂殑瀹㈡埛絝痵ocket閫氫俊銆傝繖閲岀殑鈥$spawn鈥濆氨鏄璐熻矗涓庡㈡埛絝痵ocket閫氫俊鐨剆ocket璧勬簮銆
銆銆$spawn = socket_accept($socket) or die("Could not accept incoming connectionn");
銆銆鍒扮幇鍦ㄤ負姝錛屾垜浠宸茬粡鍑嗗囧ソ浜嗘湇鍔$痵ocket 錛屼絾瀹為檯涓婅繖涓鑴氭湰騫舵病鏈夊仛浠諱綍浜嬫儏銆傛墍浠ヤ負浜嗙戶緇瀹屾垚涓婅堪鐩鏍囷紝鎴戜滑灝嗚誨彇瀹㈡埛絝痵ocket娑堟伅錛岀劧鍚庡皢鎺ユ敹鍒扮殑娑堟伅鍙嶈漿鍚庡彂鍥炵粰瀹㈡埛絝痵ocket銆
銆銆絎6姝ワ細浠庡㈡埛絝痵ocket璇誨彇娑堟伅
銆銆$input = socket_read($spawn, 1024) or die("Could not read inputn");
銆銆絎7姝ワ細鍙嶈漿娑堟伅
銆銆$output = strrev($input) . "n";
銆銆絎8姝ワ細鍙戦佹秷鎮緇欏㈡埛絝痵ocket
銆銆socket_write($spawn, $output, strlen ($output)) or die("Could not write outputn");
銆銆鍏抽棴socket
銆銆socket_close($spawn);socket_close($socket);
銆銆榪欏氨瀹屾垚浜嗘湇鍔$銆傜幇鍦錛屾垜浠瀛︿範濡備綍鍒涘緩PHP瀹㈡埛絝銆
銆銆PHP瀹㈡埛絝
銆銆鍓嶄袱涓姝ラや笌鏈嶅姟絝鐩稿悓銆
銆銆絎1姝ワ細璁劇疆鍙橀噺錛屽傗滀富鏈衡濆拰鈥滅鍙b
銆銆$host = "127.0.0.1";$port = 5353;// No Timeout set_time_limit(0);
銆銆娉錛氳繖閲岀殑絝鍙e拰涓繪満搴旇ュ拰鏈嶅姟絝涓鐨勫畾涔夋槸鐩稿悓鐨勩
銆銆絎2姝ワ細鍒涘緩socket
銆銆$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socketn");
銆銆絎3姝ワ細榪炴帴鍒版湇鍔$
銆銆$result = socket_connect($socket, $host, $port) or die("Could not connect toservern");
銆銆姝ゆ椂鍜屾湇鍔$涓嶅悓錛屽㈡埛絝痵ocket涓嶇粦瀹氱鍙e拰涓繪満銆傜浉鍙嶏紝瀹冭繛鎺ュ埌鏈嶅姟絝痵ocket錛岀瓑寰呮帴鍙楁潵鑷瀹㈡埛絝痵ocket鐨勮繛鎺ャ傝繖涓姝ュ緩絝嬩簡瀹㈡埛絝痵ocket鍒版湇鍔$痵ocket鐨勮繛鎺ャ
銆銆絎4姝ワ細鍐欏叆鏈嶅姟絝痵ocket
銆銆socket_write($socket, $message, strlen($message)) or die("Could not send data to servern");
銆銆鍦ㄦゆラや腑錛屽㈡埛絝痵ocket鐨勬暟鎹琚鍙戦佸埌鏈嶅姟絝痵ocket銆
銆銆絎5姝ワ細闃呰繪潵鑷鏈嶅姟絝鐨勫搷搴
銆銆$result = socket_read ($socket, 1024) or die("Could not read server responsen");echo "Reply From Server :".$result;
銆銆絎6姝ワ細鍏抽棴socket
銆銆socket_close($socket);
銆銆瀹屾暣鐨勪唬鐮
銆銆鏈嶅姟絝(server.php)
銆銆// set some variables$host = "127.0.0.1";$port = 25003;// don't timeout!set_time_limit(0);// create socket$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socketn");// bind socket to port$result = socket_bind($socket, $host, $port) or die("Could not bind to socketn");// start listening for connections$result = socket_listen($socket, 3) or die("Could not set up socket listenern");// accept incoming connections// spawn another socket to handle communication$spawn = socket_accept($socket) or die("Could not accept incoming connectionn");// read client input$input = socket_read($spawn, 1024) or die("Could not read inputn");// clean up input string$input = trim($input);echo "Client Message : ".$input;// reverse client input and send back$output = strrev($input) . "n";socket_write($spawn, $output, strlen ($output)) or die("Could not write outputn");// close socketssocket_close($spawn);socket_close($socket);
銆銆瀹㈡埛絝(client.php)
銆銆$host = "127.0.0.1";$port = 25003;$message = "Hello Server";echo "Message To server :".$message;// create socket$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socketn");// connect to server$result = socket_connect($socket, $host, $port) or die("Could not connect to servern"); // send string to serversocket_write($socket, $message, strlen($message)) or die("Could not send data to servern");// get server response$result = socket_read ($socket, 1024) or die("Could not read server responsen");echo "Reply From Server :".$result;// close socketsocket_close($socket);
銆銆寤虹珛涓婅堪鏂囦歡(server.php鍜宑lient.php)鍚庯紝鎵ц屽備笅鎿嶄綔錛
銆銆澶嶅埗www鐩褰曚腑鐨勮繖浜涙枃浠(鍋囪網AMP)錛屽畨緗浜嶤:wamp銆
銆銆鎵撳紑Web嫻忚堝櫒錛屽湪鍦板潃鏍忎腑閿鍏localhost 銆
銆銆鍏堟祻瑙坰erver.php鐒跺悗client.php銆

F. php鍗蟲椂閫氳鏄鎬庝箞鎼寤虹殑錛熸湁娌℃湁鐭ラ亾鐨勶紵

鍗蟲椂閫氳鐨勬牳蹇冨湪浜嶹ebSocket錛屽畠鏄瀹炵幇鍗蟲椂閫氳鐨勫父鐢ㄥ崗璁涔嬩竴錛屽師鐞嗘槸鍦ㄥ崟涓猅CP榪炴帴涓婃彁渚涘弻鍚戦氫俊鐨勫崗璁錛岄氬父琚鐢ㄤ簬瀹炴椂閫氫俊銆佹父鎴忋佸湪綰誇氦鏄撶瓑鍦烘櫙銆

浼犵粺鐨刉eb搴旂敤紼嬪簭鏄鍩轟簬HTTP鍗忚鐨勶紝HTTP鏄涓縐嶆棤鐘舵佸崗璁錛屾瘡嬈¤鋒眰閮介渶瑕侀噸鏂板緩絝嬭繛鎺ワ紝鍥犳ら毦浠ュ疄鐜板疄鏃墮氫俊銆傝學ebSocket鍗忚閫氳繃鍦ㄥ緩絝嬭繛鎺ュ悗淇濇寔闀胯繛鎺ワ紝鍏佽告湇鍔″櫒涓誨姩鍚戝㈡埛絝鍙戦佹暟鎹錛屼粠鑰屽疄鐜板弻鍚戦氫俊銆

WebSocket鍗忚鍏佽稿湪鏈嶅姟鍣ㄧ鍜屽㈡埛絝涔嬮棿鍙戦佷換鎰忔暟鎹錛屽寘鎷鏂囨湰銆佷簩榪涘埗鏁版嵁銆丣SON絳夋牸寮忕殑鏁版嵁銆傚㈡埛絝鍜屾湇鍔″櫒絝閮藉彲浠ュ彂閫佹暟鎹錛岃屼笖涓嶉渶瑕侀氳繃HTTP鐨勪腑闂村眰榪涜岃漿鎹錛屼粠鑰屽噺灝戜簡緗戠粶寤惰繜鍜屽甫瀹界殑娑堣椼

瑕佹惌寤篜HP鍗蟲椂閫氳緋葷粺錛屽彲浠ラ伒寰浠ヤ笅姝ラわ細

浠ヤ笅鏄涓浜涘︿範PHP鍗蟲椂閫氳鐨勮祫鏂欙紝榪欎簺璧勬枡鍙浠ュ府鍔╀綘鍏ラ棬錛

G. php本地用虛擬機怎麼模擬socket

利用socket發送HTTP請求。

Socket的英文原義是「孔」或「插座」。通常也稱作「套接字」,用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。如此看來,其實利用socket操作遠程文件和讀寫本地的文件一樣容易,把本地文件看成通過硬體傳輸,遠程文件通過網線傳輸就行了。

因而可以將發送請求的考慮成建立連接->打開socket介面(fsockopen())->寫入請求(fwrite())->讀出響應(fread()->關閉文件(fclose())。話不多說,直接上代碼:

conn($url);
$this->setHeader('Host:'.$this->url['host']);
}

//此方法負責寫請求行
protectedfunctionsetLine($method){
$this->line[0]=$method.''.$this->url['path'].'?'.$this->url['query'].''.歷乎$this->version;
}

//此方法負責寫頭信息
publicfunctionsetHeader($headerline){
$this->header[]=$headerline;
}

//此方法負責寫主體信息
protectedfunctionsetBody($body){
$this->body[]=http_build_query($body);
}


//連接url
publicfunctionconn($url){
$this->url=parse_url($url);
//判斷埠
if(!isset($this->url['port'])){
$this->url['port']=80;
}

//判斷query
if(!isset($this->url['query'])){
$this->url['query']='';
}

$this->fh=fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3);
}

//構造get請求的肢配悉數據
publicfunctionget(){
$this->setLine('GET');
$this->request();
return$this->response;
}

//構造post查詢的數據
publicfunctionpost($body=array()){
$this->setLine('POST');

//設計content-type
$this->setHeader('Content-type:application/x-www-form-urlencoded');

//設計主體信息,比GET不一樣的地方
$this->setBody($body);


//計算content-length
$this->setHeader('Content-length:'.strlen($this->body[0]));

$this->request();

return$this->response;
}

//真正請求
publicfunctionrequest(){
//把請求行,頭信息,實體信息放在一個數組里,便於拼接
$req=array_merge($this->line,$this->header,array(''),$this->body,array(''));
//print_r($req);

$req=implode(self::CRLF,$req);
//echo$req;exit;

fwrite($this->fh,$req);

while(!feof($this->fh)){
$this->response.=fread($this->fh,1024);
}

$this->close();//關閉連接
}


//關閉連接
publicfunctionclose(){
賣缺fclose($this->fh);
}

}

閱讀全文

與phpsocket文件上傳相關的資料

熱點內容
水印相機收藏文件夾 瀏覽:570
如何懟程序員面試官 瀏覽:260
應用加密的優缺點 瀏覽:74
程序員培訓班不給錢 瀏覽:513
一堆伺服器能做什麼盈利 瀏覽:367
v20方舟編譯器推送 瀏覽:395
痛點pdf 瀏覽:916
php二維數組取部分值 瀏覽:390
重構流程壓縮時間高效管控 瀏覽:690
phpform參數詳解 瀏覽:559
此伺服器未開啟是什麼意思 瀏覽:83
python怎樣定義全局變數 瀏覽:159
加密代碼和加密編碼 瀏覽:93
將項目部署到伺服器有什麼作用 瀏覽:437
自研演算法視頻大全 瀏覽:702
寶可夢源碼下載 瀏覽:343
python怎麼沒有中文 瀏覽:437
php音樂管理 瀏覽:622
英漢百科圖解詞典pdf 瀏覽:932
php中文轉unicode編碼 瀏覽:75