位置: 編程技術(shù) - 正文
推薦整理分享php的socket編程詳解(php socket編程),希望有所幫助,僅作參考,歡迎閱讀內(nèi)容。
文章相關(guān)熱門搜索詞:簡單理解php的socket編程,php socketio,php sockets,php socket編程,php socket_select,php socketio,php socketio,php socket編程,內(nèi)容如對(duì)您有幫助,希望把文章鏈接給更多的朋友!
php的socket編程算是比較難以理解的東西吧,不過,我們只要理解socket幾個(gè)函數(shù)之間的關(guān)系,以及它們所扮演的角色,那么理解起來應(yīng)該不是很難了,在筆者看來,socket編程,其實(shí)就是建立一個(gè)網(wǎng)絡(luò)服務(wù)的客戶端和服務(wù)端,這和mysql的客戶端和服務(wù)端是一樣的,你只要理解mysql的客戶端和服務(wù)端是怎么一回事,你就應(yīng)該能夠理解下面我要講的東西吧。
關(guān)于socket編程所涉及到的網(wǎng)絡(luò)協(xié)議,什么TCP啊,UDP啊,什么socket三次握手等等,這些網(wǎng)絡(luò)協(xié)議網(wǎng)上有很詳細(xì)的解釋,這里不講,只截個(gè)socket建立套接的過程圖讓你瞧瞧:
這個(gè)圖是我辛辛苦苦從別人那里盜截過來的,你一定要好好看啊,同時(shí),在這里我也向那個(gè)被我盜截圖的筆者表示感謝,本人對(duì)自己盜取你的圖案表示歉意,還望你大人大量不要計(jì)較啊。本人實(shí)在太懶了,懶得畫圖,(其實(shí)是對(duì)自己的畫圖技術(shù)表示不自信,呵呵)。
socket是怎么建立連接的呢?上面已經(jīng)提到過了,它建立連接的過程是與mysql的客戶端和服務(wù)端的連接本質(zhì)是一樣的。而它與mysql不同的是,mysql的服務(wù)端和客戶端都已經(jīng)為我們編輯好了,我們只要應(yīng)用就行了。但是,關(guān)鍵時(shí)刻來啦,socket它什么東西都沒有提供給我們,唯一提供給我們的就是:幾十個(gè)socket函數(shù)。
這言外之意就是說,socket編程就是要我們自己創(chuàng)建服務(wù)端和客戶端,也就是說,``socket編程``——就是要我們自己建立一個(gè)類似于mysql的服務(wù)端和客戶端的應(yīng)用。
說到這里,我想問一句,你說這socket讓人頭疼不?它既不建立個(gè)服務(wù)端,也不建立個(gè)客戶端給我們應(yīng)用,非要讓我們自己去應(yīng)用socket的函數(shù),創(chuàng)建一個(gè)屬于我們自己的網(wǎng)絡(luò)協(xié)議套接應(yīng)用,這是不是很讓你頭疼呢?頭疼也沒辦法,要是你需要自己的應(yīng)用,你還是不得不跟socket打交道。呵呵,這只是題外話,不多說,下面進(jìn)入正題。
在你沒有被socket編程搞蒙之前,我還是讓你看看socket的幾個(gè)關(guān)鍵函數(shù),先給你解釋一下它們各自的作用。不然,要是對(duì)socket編程一點(diǎn)基礎(chǔ)都沒有的人看到了,我怕你看了之后,就果斷跳過這篇文章,從此對(duì)socket產(chǎn)生恐懼癥了。呵呵,又多說了。
socket的關(guān)鍵函數(shù)1:
socket_create($net參數(shù)1,$stream參數(shù)2,$protocol參數(shù)3)
作用:創(chuàng)建一個(gè)socket套接字,說白了,就是一個(gè)網(wǎng)絡(luò)數(shù)據(jù)流。
返回值:一個(gè)套接字,或者是false,參數(shù)錯(cuò)誤發(fā)出E_WARNING警告
php的在線手冊(cè)那里說得更清楚:
socket_create創(chuàng)建并返回一個(gè)套接字,也稱作一個(gè)通訊節(jié)點(diǎn)。一個(gè)典型的網(wǎng)絡(luò)連接由 2 個(gè)套接字構(gòu)成,一個(gè)運(yùn)行在客戶端,另一個(gè)運(yùn)行在服務(wù)器端。
上面一句話是從php在線手冊(cè)那里復(fù)制過來的??吹?jīng)]有,這里說得意思是不是和我上面反反復(fù)復(fù)提到的客戶端與服務(wù)端一模一樣?呵呵。
參數(shù)1是:網(wǎng)絡(luò)協(xié)議,
網(wǎng)絡(luò)協(xié)議有哪些?它的選擇項(xiàng)就下面這三個(gè):
AF_INET: IPv4 網(wǎng)絡(luò)協(xié)議。TCP 和 UDP 都可使用此協(xié)議。一般都用這個(gè),你懂的。
AF_INET6: IPv6 網(wǎng)絡(luò)協(xié)議。TCP 和 UDP 都可使用此協(xié)議。
AF_UNIX: 本地通訊協(xié)議。具有高性能和低成本的 IPC(進(jìn)程間通訊)。
參數(shù)2:套接字流,選項(xiàng)有:
SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM。
這里只對(duì)前兩個(gè)進(jìn)行解釋:
SOCK_STREAM TCP 協(xié)議套接字。
SOCK_DGRAM UDP協(xié)議套接字。
欲了解更多請(qǐng)鏈接這里: 參數(shù)3:protocol協(xié)議,選項(xiàng)有:
SOL_TCP: TCP 協(xié)議。
SOL_UDP: UDP協(xié)議。
從這里可以看出,其實(shí)socket_create函數(shù)的第二個(gè)參數(shù)和第三個(gè)參數(shù)是相關(guān)聯(lián)的。
比如,假如你第一個(gè)參數(shù)應(yīng)用IPv4協(xié)議:AF_INET,然后,第二個(gè)參數(shù)應(yīng)用的是TCP套接字:SOCK_STREAM,
那么第三個(gè)參數(shù)必須要用SOL_TCP,這個(gè)應(yīng)該不難理解。
TCP 協(xié)議套接字嘛,當(dāng)然只能用TCP協(xié)議了,是不是?如果你應(yīng)用UDP套接字,那么第三個(gè)參數(shù)該怎么選擇我就不說了,呵呵,你懂的。
關(guān)鍵函數(shù)2:
socket_connect($socket參數(shù)1,$ip參數(shù)2,$port參數(shù)3)
作用:連接一個(gè)套接字,返回值為true或者false
參數(shù)1:socket_create的函數(shù)返回值
參數(shù)2:ip地址
參數(shù)3:端口號(hào)
關(guān)鍵函數(shù)3:
socket_bind($socket參數(shù)1,$ip參數(shù)2,$port參數(shù)3)
作用:綁定一個(gè)套接字,返回值為true或者false
參數(shù)1:socket_create的函數(shù)返回值
參數(shù)2:ip地址
參數(shù)3:端口號(hào)
關(guān)鍵函數(shù)4:
socket_listen($socket參數(shù)1,$backlog 參數(shù)2)
作用:監(jiān)聽一個(gè)套接字,返回值為true或者false
參數(shù)1:socket_create的函數(shù)返回值
參數(shù)2:最大監(jiān)聽套接字個(gè)數(shù)
關(guān)鍵函數(shù)5:
socket_accept($socket)
作用:接收套接字的資源信息,成功返回套接字的信息資源,失敗為false
參數(shù):socket_create的函數(shù)返回值
關(guān)鍵函數(shù)6:
socket_read($socket參數(shù)1,$length參數(shù)2)
作用:讀取套接字的資源信息,
返回值:成功把套接字的資源轉(zhuǎn)化為字符串信息,失敗為false
參數(shù)1:socket_create或者socket_accept的函數(shù)返回值
參數(shù)2:讀取的字符串的長度
關(guān)鍵函數(shù)7:
socket_write($socket參數(shù)1,$msg參數(shù)2,$strlen參數(shù)3)
作用:把數(shù)據(jù)寫入套接字中
返回值:成功返回字符串的字節(jié)長度,失敗為false
參數(shù)1:socket_create或者socket_accept的函數(shù)返回值
參數(shù)2:字符串
參數(shù)3:字符串的長度
關(guān)鍵函數(shù)8:
socket_close($socket)
作用:關(guān)閉套接字
返回值:成功返回true,失敗為false
參數(shù):socket_create或者socket_accept的函數(shù)返回值
這八個(gè)函數(shù)是socket的核心函數(shù),下面列舉兩個(gè)個(gè)比較重要的函數(shù)
socket_last_error($socket),參數(shù)為socket_create的返回值,作用是獲取套接字的最后一條錯(cuò)誤碼號(hào),返回值套接字code
socket_strerror($code),參數(shù)為socket_last_error函數(shù)的返回值,獲取code的字符串信息,返回值也就是套接字的錯(cuò)誤信息
這兩個(gè)函數(shù)在socket編程中還是很重要的,在寫socket編程的時(shí)候,我覺得你還是得利用起來,特別是新手,可以當(dāng)做調(diào)試用
下面就是代碼了,注意注意,請(qǐng)認(rèn)真看我的注釋,注釋很重要,注釋很重要,注釋很重要,重要的事情要大喊三遍,呵呵。
服務(wù)端腳本,D:vhosttestsocketserver_socket.php
小提示:請(qǐng)注意上面的socket_bind,socket_listen,socket_accept三個(gè)函數(shù)的執(zhí)行順序不可更改,也就是說
必須先執(zhí)行socket_bind,再執(zhí)行socket_listen,最后才執(zhí)行socket_accept
客戶端腳本,D:vhosttestsocketclient_socket.php
怎么測試這兩個(gè)腳本呢?
首先打開windows的dos窗口,就是cmd黑窗口,然后,運(yùn)行php D:vhosttestsocketserver_socket.php,
讓服務(wù)端的的黑窗口持續(xù)運(yùn)行的,
其次,php的客戶端腳本可以通過瀏覽器運(yùn)行,也可以再開一個(gè)cmd黑窗口運(yùn)行
php D:vhosttestsocketclient_socket.php
在這里請(qǐng)注意:php這個(gè)運(yùn)行命名必須加入windows的環(huán)境變量中,假如不知道怎么加,
請(qǐng)進(jìn)入php運(yùn)行命令目錄用絕對(duì)命令運(yùn)行,也可以百度把php命令加入環(huán)境變量中
這里是我的情況,你的文件地址可能和我不一樣,請(qǐng)按照你的地址情況來操作,否則,后果自負(fù),呵呵
上面已經(jīng)說過了,socket編程必須要有服務(wù)端才能交流,所以服務(wù)端的黑窗口是必須讓它持續(xù)開著的。
后記補(bǔ)充:
socket_set_option($socket參數(shù)1 ,$level 參數(shù)2,$optname 參數(shù)3,$optval 參數(shù)4)
這個(gè)函數(shù)的作用是給套接字設(shè)置數(shù)據(jù)流選項(xiàng),還是一個(gè)很重要的函數(shù)。
參數(shù)1:socket_create或者socket_accept的函數(shù)返回值
參數(shù)2:SOL_SOCKET,好像只有這個(gè)選項(xiàng)
參數(shù)3與參數(shù)4是相關(guān)聯(lián)的,
參數(shù)3可為:SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO
解釋一下:
SO_REUSEADDR 是讓套接字端口釋放后立即就可以被再次使用
參數(shù)3假如是這個(gè),則參數(shù)4可以為true或者false
SO_RCVTIMEO 是套接字的接收資源的最大超時(shí)時(shí)間
SO_SNDTIMEO 是套接字的發(fā)送資源的最大超時(shí)時(shí)間
參數(shù)3假如是這兩個(gè),則參數(shù)4是一個(gè)這樣的數(shù)組array('sec'=>1,'usec'=>)
數(shù)組里面都是設(shè)置超時(shí)的最大時(shí)間,不過,一個(gè)是秒為單位,一個(gè)是微秒單位,作用都一樣
php中strtotime函數(shù)性能分析 最近在做一個(gè)游戲數(shù)據(jù)統(tǒng)計(jì)后臺(tái),最基礎(chǔ)的功能是通過分析注冊(cè)登錄日志來展示用戶數(shù)據(jù)。在公司內(nèi)部測試,用戶量很少,所以就沒有發(fā)現(xiàn)什么性能問
php運(yùn)行報(bào)錯(cuò)Call to undefined function curl_init()的最新解決方法 之前網(wǎng)上的解決方法如下:1、在php.ini中開啟curl擴(kuò)展2、將php目錄下的libeay.dll、ssleay.dll、php5ts.dll拷貝到c:windowssystem里面(還有一種方法是說在httpd
靜態(tài)html文件執(zhí)行php語句的方法(推薦) HTM文件中的PHP語句不會(huì)被執(zhí)行,如何在HTML文件中運(yùn)行php代碼?html文件執(zhí)行php語句的方法:1,修改httpd.conf,命令A(yù)pache把HTML當(dāng)作PHP,需要修改服務(wù)器里的ht
標(biāo)簽: php socket編程
本文鏈接地址:http://esstyw.cn/biancheng/301167.html 轉(zhuǎn)載請(qǐng)保留說明!上一篇:PHP內(nèi)置加密函數(shù)詳解(php加密技術(shù))
網(wǎng)站地圖: 企業(yè)信息 工商信息 財(cái)稅知識(shí) 網(wǎng)絡(luò)常識(shí) 編程技術(shù)
友情鏈接: 武漢網(wǎng)站建設(shè)