亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php Socket 基礎

2024-05-05 00:11:05
字體:
來源:轉載
供稿:網友

◆ Socket 基礎
PHP使用Berkley的socket庫來創建它的連接。socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和服務器之間的會話。這個服務器是一直在監聽準備產生一個新的會話。當一個客戶端連接服務器,它就打開服務器正在進行監聽的一個端口進行會話。這時,服務器端接受客戶端的連接請求,那么就進行一次循環?,F在這個客戶端就能夠發送信息到服務器,服務器也能發送信息給客戶端。
產生一個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并且返回一個socket資源的實例
socket_bind($socket, ‘localhost’, 1337);//綁定socket到本地計算機
socket_listen($socket);//監聽所有進來的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中關于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_bind()     把socket綁定在一個IP地址和端口上
socket_listen($socket);
// Initialize the buffer
$buffer = "NO DATA";
while(true) {
// Accept any connections coming in on this socket
$connection = socket_accept($socket);//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"); //socket_write()     寫數據到socket緩存
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))//socket_read()     讀取指定長度的數據
{
$buffer = $data;
socket_write($connection, "Information Received/r/n");
printf("Buffer: " . $buffer . "/r/n");
}
socket_close($connection); //socket_close()     關閉一個socket資源
printf("Closed the socket/r/n/r/n");
}
?>
這個服務器端要做什么呢?它初始化一個socket并且打開一個緩存收發數據。它等待連接,一旦產生一個連接,它將打印“Socket connected”在服務器端的屏幕上。這個服務器檢查緩沖區,如果緩沖區里有數據,它將把數據發送到連接過來的計算機。然后它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據里,并且讓連接的計算機知道這些信息,最后關閉連接。當連接關閉后,服務器又開始處理下一次連接。
◆ 產生一個客戶端
處理第二個問題是很容易的。你需要產生一個php頁連接一個socket,發送一些數據進它的緩存并處理它。然后你有個處理后的數據在還頓,你能夠發送你的數據到服務器。在另外一臺客戶端連接,它將處理那些數據。
下面的例子示范了使用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>”);
?>
這個例子的代碼演示了客戶端連接到服務器??蛻舳俗x取數據。如果這是第一時間到達這個循環的首次連接,這個服務器將發送“NO DATA”返回給客戶端。如果情況發生了,這個客戶端在連接之上??蛻舳税l送它的數據到服務器,數據發送給服務器,客戶端等待響應。一旦接受到響應,那么它將把響應寫到屏幕上。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美www在线| 国产欧美一区二区三区久久人妖| 欧美视频在线观看 亚洲欧| 欧美日韩在线视频首页| 色黄久久久久久| 精品久久久在线观看| 不卡av电影在线观看| 欧美性高潮在线| 国产xxx69麻豆国语对白| 欧美在线观看日本一区| 亚洲国产精品va在线观看黑人| 亚洲国产精品va在线看黑人| 久久综合色影院| 国产免费一区视频观看免费| 久久夜色精品国产亚洲aⅴ| 97精品国产97久久久久久免费| 亚洲国产中文字幕久久网| 欧美激情在线视频二区| 这里只有精品视频在线| 国产玖玖精品视频| 欧美精品九九久久| 九九热视频这里只有精品| 亚洲国产精品久久久久秋霞不卡| 久久免费精品视频| 国产91在线高潮白浆在线观看| 欧美日韩xxx| 96精品久久久久中文字幕| 国产日韩欧美在线| 成人h视频在线观看播放| 日韩精品在线免费播放| 精品国内产的精品视频在线观看| 国产精品电影在线观看| xxxx欧美18另类的高清| 日本精品久久电影| 日韩中文在线中文网在线观看| 中文字幕日韩精品有码视频| 国内精品400部情侣激情| 欧美猛男性生活免费| 国产精品久久久久久久久久99| 亚洲成人aaa| 国产日本欧美一区二区三区在线| 欧美裸体xxxx极品少妇| 亚洲国产欧美在线成人app| 亚洲精品国产精品乱码不99按摩| 91精品综合久久久久久五月天| 亚洲精品黄网在线观看| 91九色国产社区在线观看| 92福利视频午夜1000合集在线观看| 久久av在线播放| 国产一区二区欧美日韩| 精品国产精品自拍| 日韩av不卡电影| 亚洲欧洲一区二区三区在线观看| 久久影院资源站| 人九九综合九九宗合| 久久亚洲一区二区三区四区五区高| 国产精品久久电影观看| 久久久久久中文字幕| 亚洲国产精品美女| 26uuu国产精品视频| 精品欧美激情精品一区| 欧美国产日韩一区二区三区| 欧美激情在线狂野欧美精品| 色狠狠久久aa北条麻妃| 亚洲偷熟乱区亚洲香蕉av| 日韩欧美中文字幕在线播放| 欧美不卡视频一区发布| 日韩在线免费观看视频| 久久久噜噜噜久久久| 国产精品福利在线观看网址| 欧美高清videos高潮hd| 亚洲第一男人av| 欧美性猛交xxxx黑人猛交| 欧美性受xxx| 久久99精品久久久久久琪琪| 57pao国产精品一区| 国产美女精品视频| 国产91精品久久久久| 亚洲欧美精品在线| 亚洲国产美女久久久久| 国产精品亚洲激情| 久久香蕉精品香蕉| 日韩精品中文字幕有码专区| 高清欧美性猛交xxxx黑人猛交| 最近2019中文字幕第三页视频| 日韩av免费在线| 亚洲精品美女在线观看播放| 亚洲成av人片在线观看香蕉| 最近2019中文免费高清视频观看www99| 国产精品高潮呻吟久久av黑人| 日韩在线观看免费高清| 97精品国产97久久久久久免费| 国产欧美最新羞羞视频在线观看| 欧美在线不卡区| 最近2019中文字幕一页二页| 久久福利网址导航| 亚洲欧美第一页| 欧美中文字幕视频在线观看| 亚洲午夜未满十八勿入免费观看全集| 全球成人中文在线| 欧美日韩国产区| 一区二区三区精品99久久| 欧美一级淫片videoshd| 在线色欧美三级视频| 日韩av网站导航| 黑人精品xxx一区一二区| 久热在线中文字幕色999舞| 欧美在线视频一区| 日韩精品久久久久久久玫瑰园| 亚洲天堂av在线免费| 亚洲大胆人体在线| 国产在线观看一区二区三区| 精品亚洲男同gayvideo网站| 欧美成人免费全部观看天天性色| 久久国产精品久久久久久| 成人国内精品久久久久一区| 日韩电影免费在线观看中文字幕| 久久久免费观看视频| 日本午夜在线亚洲.国产| 亚洲精品xxxx| 最新国产精品拍自在线播放| 国产精品户外野外| 亚洲伊人一本大道中文字幕| 亚洲影院污污.| 色婷婷综合久久久久中文字幕1| 欧美精品少妇videofree| 韩国三级电影久久久久久| 欧美另类在线观看| 成人在线免费观看视视频| 亚洲综合视频1区| 欧美www视频在线观看| 日韩专区在线观看| 欧美黑人狂野猛交老妇| 最新亚洲国产精品| 国产亚洲精品久久久久动| 最近日韩中文字幕中文| 成人精品视频99在线观看免费| 国产精品一区二区三| 色综合91久久精品中文字幕| 国产精品jvid在线观看蜜臀| 亚洲精品久久久一区二区三区| 国产丝袜一区视频在线观看| 日韩一中文字幕| 久久69精品久久久久久国产越南| 亚洲欧美国产日韩中文字幕| 黑人狂躁日本妞一区二区三区| 亚洲美女又黄又爽在线观看| 97色伦亚洲国产| 国产在线一区二区三区| 亚洲天堂视频在线观看| 亚洲视频自拍偷拍| 亚洲欧洲高清在线| 欧美日韩中文字幕| 少妇高潮 亚洲精品| 成人免费视频在线观看超级碰| 欧美裸体男粗大视频在线观看| 福利视频一区二区| 91精品在线影院| 狠狠躁18三区二区一区| 亚洲欧美精品一区二区| 亚洲第一色中文字幕| 日本不卡高字幕在线2019| 国产日本欧美在线观看| 国产精品jvid在线观看蜜臀|