今天終於測試成功了php中的socket通訊,先看原理圖
這裡可以清晰的看到socket到底是在網路模型中的哪個位置,還有與連接埠的形象表示
我們編程就是按這個順序的,請看下面的圖
這下我們好寫程式了,先看Server端 儲存為serverSocket.php
<?php set_time_limit(0);$host="localhost";$port=1000;//建立一個串連$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socket\n");//綁定socket到連接埠$result=socket_bind($socket,$host,$port) or die("cannot bind port to socket\n");//開始監聽這個連接埠$result=socket_listen($socket,4) or die("could not set up socket listen\n");//接受串連,另一個socket來處理通訊$msgsock=socket_accept($socket) or die("cannot accept incoming connection\n");if($msgsock){echo date("Y-m-d H:i:s D a");}//讀取用戶端發送過來的資訊$input=socket_read($msgsock,1024) or die("cannot read input\n");$input=trim($input);$output=strrev($input)."順序反過來了吧\n";//對接收到的資訊進行處理,然後返回到用戶端socket_write($msgsock,$output,strlen($output)) or die("cannot write");//關閉socket串連socket_close($msgsock);socket_close($socket);?>
再來看Client用戶端的代碼 儲存為client.php
<?php set_time_limit(0);$host="localhost";$port=1000;//建立一個socket$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socket\n");$conn=socket_connect($socket,$host,$port) or die("cannot connect server\n");if($conn){echo "client connect ok!";}socket_write($socket,"hello world!") or die("cannot write data\n");$buffer=socket_read($socket,1024,PHP_NORMAL_READ);if($buffer){echo "response was:".$buffer."\n";}socket_close($socket);?>
注意事項: 1 測試socket的時候必須要確定你是否開啟socket擴充庫,如果沒有請到php.ini中找到extension_dir=php_sockets.dll,把 前面的分號去掉
2 測試時,在瀏覽器中輸入http://localhost/serverSocket.php 和http://localhost/client.php ,現在問題就來了,到底先運 行哪個呢,因為 用戶端要回應,所以我們先運行server再運行client ,這樣你就能看到結果了。
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() 寫資料到分散/彙總數組