php監聽socket,Php監聽文件變化

本文目錄一覽:

PHP編程語言中的socket是什麼東西

HP使用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。Resourecesocket_create(intprotocol,intsocketType,intcommonProtocol);現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。上面這個例子產生一個你自己的服務器端。例子第一行,$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()刪除一個已經分配的iovecsocket_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,如果沒有指定則默認當前socketsocket_recvmsg()從iovec里接受消息socket_select()多路選擇socket_send()這個函數發送數據到已連接的socketsocket_sendmsg()發送消息到socketsocket_sendto()發送消息到指定地址的socketsocket_set_block()在socket里設置為塊模式socket_set_nonblock()socket里設置為非塊模式socket_set_option()設置socket選項socket_shutdown()這個函數允許你關閉讀、寫、或者指定的socketsocket_strerror()返回指定錯誤號的詳細錯誤socket_write()寫數據到socket緩存socket_writev()寫數據到分散/聚合數組(注:函數介紹刪減了部分原文內容,函數詳細使用建議參考英文原文,或者參考PHP手冊)以上所有的函數都是PHP中關於socket的,使用這些函數,你必須把你的socket打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋:extension=php_sockets.dll如果你無法去掉注釋,那麼請使用下面的代碼來加載擴展庫:如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。如下圖:查看phpinfo()關於socket的信息◆ 產生一個服務器現在我們把第一個例子進行完善。你需要監聽一個指定的socket並且處理用戶的連接。你應該使用你的命令提示符來運行這個例子。理由是因為這裡將產生一個服務器,而不是一個Web頁面。如果你嘗試使用Web瀏覽器來運行這個腳本,那麼很有可能它會超過30秒的限時。你可以使用下面的代碼來設置一個無限的運行時間,但是還是建議使用命令提示符來運行。set_time_limit(0);在你的命令提示符中對這個腳本進行簡單測試:Php.exeexample01_server.php如果你沒有在系統的環境變量中設置php解釋器的路徑,那麼你將需要給php.exe指定詳細的路徑。當你運行這個服務器端的時候,你能夠通過遠程登陸(telnet)的方式連接到端口1337來測試這個服務器。如下圖:上面的服務器端有三個問題:1.它不能接受多個連接。2.它只完成唯一的一個命令。3.你不能通過Web瀏覽器連接這個服務器。這個第一個問題比較容易解決,你可以使用一個應用程序去每次都連接到服務器。但是後面的問題是你需要使用一個Web頁面去連接這個服務器,這個比較困難。你可以讓你的服務器接受連接,然後些數據到客戶端(如果它一定要寫的話),關閉連接並且等待下一個連接。在上一個代碼的基礎上再改進,產生下面的代碼來做你的新服務器端:這個服務器端要做什麼呢?它初始化一個socket並且打開一個緩存收發數據。它等待連接,一旦產生一個連接,它將打印「Socketconnected」在服務器端的屏幕上。這個服務器檢查緩衝區,如果緩衝區里有數據,它將把數據發送到連接過來的計算機。然後它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據里,並且讓連接的計算機知道這些信息,最後關閉連接。當連接關閉後,服務器又開始處理下一次連接。(翻譯的爛,附上原文)Thisiswhattheserverdoes.Itinitializesthesocketandthebufferthatyouusetoreceiveandsenddata.Thenitwaitsforaconnection.Onceaconnectioniscreateditprints「Socketconnected」tothescreentheserverisrunningon.Theserverthencheckstoseeifthereisanythinginthebuffer;ifthereis,itsendsthedatatotheconnectedcomputer.Afteritsendsthedataitwaitstoreceiveinformation.Onceitreceivesinformationitstoresitinthedata,letstheconnectedcomputerknowthatithasreceivedtheinformation,andthenclosestheconnection.Aftertheconnectionisclosed,theserverstartsthewholeprocessagain.◆ 產生一個客戶端處理第二個問題是很容易的。你需要產生一個php頁連接一個socket,發送一些數據進它的緩存並處理它。然後你又個處理後的數據在還頓,你能夠發送你的數據到服務器。在另外一台客戶端連接,它將處理那些數據。Tosolvethesecondproblemisveryeasy.YouneedtocreateaPHPpagethatconnectstoasocket,receiveanydatathatisinthebuffer,andprocessit.Afteryouhaveprocessedthedatainthebufferyoucansendyourdatatotheserver.Whenanotherclientconnects,itwillprocessthedatayousentandtheclientwillsendmoredatabacktotheserver.下面的例子示範了使用socket:這個例子的代碼演示了客戶端連接到服務器。客戶端讀取數據。如果這是第一時間到達這個循環的首次連接,這個服務器將發送「NODATA」返回給客戶端。如果情況發生了,這個客戶端在連接之上。客戶端發送它的數據到服務器,數據發送給服務器,客戶端等待響應。一旦接受到響應,那麼它將把響應寫到屏幕上。

我用php socket監聽客戶端,但是那個頁面在一直刷新,怎樣把它隱藏或者後台運行?

3種方法:

1、AJAX

AJAX與後台進行交互,可以實現靜態刷新

2、IFrame

在頁面內置IFrame,這個不用多說了

3、使用php的ignore_user_abort();使用這個需要注意的是不要讓程序超時,PHP默認是30秒,所以值得把set_time_limit()填寫較大的值。

求助,php端口持續監聽socket-CSDN論壇

你用 socket 擴展寫一個服務端程序就可以了

由於不知道你們的通訊協議,也沒法給具體代碼

socket_create 創建一個 socket

socket_bind 綁定 ip 和 端口

socket_listen 建立監聽

循環中

socket_accept 接受一個 socket

socket_read 讀

socket_write 寫

你有什麼不懂可以上後盾人上看看.上面有很多高清教學視頻。.,?講得都是這些知識.可以幫助你!

php中關於socket的系列函數總結

本文列舉了所有關於PHP語言中使用socket相關服務的一些函數。注意使用如下函數之前,你需要確保你的socket已打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋(分號):

代碼如下:

extension=php_sockets.dll

如果你無法去掉注釋,那麼請使用下面的代碼來加載擴展庫:

代碼如下:

if(!extension_loaded(‘sockets’)){

if(strtoupper(substr(PHP_OS,3))==”WIN”){

dl(‘php_sockets.dll’);

}else{

dl(‘sockets.so’);

}

}

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

php

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()

寫數據到分散/聚合數組

原創文章,作者:JJEH,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/133952.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JJEH的頭像JJEH
上一篇 2024-10-04 00:02
下一篇 2024-10-04 00:02

相關推薦

發表回復

登錄後才能評論