php 基於socket的基本通信 1、前言 Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的 ...
php 基於socket的基本通信
1、前言
Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議。
這種介紹度娘很多,希望瞭解更多的自行百度,往下看的朋友記得先開啟socket擴展;
2、創建socke伺服器端
基本步驟:
- 初始化86socket
- 埠綁定
- 埠進行監聽
- 調用accept阻塞
- 等待客服端連接
3、伺服器端代碼實現
<?php echo "****************server*****************\r\n"; //設置 IP 和 埠(埠必須保證不被占用,且允許被外部訪問) $ip = "127.0.0.1"; $port = 1935; //超時設計 set_time_limit(0); //創建socket $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("創建socket失敗,原因為:{socket_strerror($socket)}\r\n"); //綁定socket到指定ip和埠 $ret = socket_bind($socket, $ip, $port) or die("綁定socket失敗,原因為:{socket_strerror($ret)}\r\n"); //監聽socket,最大等會數為4 $ret = socket_listen($socket, 4) or die("監聽socket失敗,原因為:{socket_strerror($ret)}\r\n"); //計數 $count = 0; echo "等待連接!!!\r\n"; do { //收到請求連接 //調用子socket處理信息 $msgsock = socket_accept($socket); if(!$msgsock){ echo "socket阻塞失敗,原因為:{socket_strerror($msgsock)}\r\n"; } $msg = "<p style='color:red'>連接成功</p>"; //處理客服端輸入並返回數據 socket_write($msgsock, $msg, strlen($msg)); $buf = socket_read($msgsock, 8192); $talkback = "收到的信息為:{$buf}\r\n"; echo $talkback; if(++$count > 5) { break; } socket_close($msgsock); } while(true); socket_close($socket);
4、創建slient客戶端
基本步驟:
- 使用TCP協議創建一個socket資源
- 連接socket伺服器
- socket_write 傳輸數據
- socket_read 接收數據
- 關閉socket資源
5、客戶端代碼實現
<?php echo '****************client*****************<br/>'; //設置 IP 和 埠 $port = 1935; $ip = '127.0.0.1'; //超時設計 set_time_limit(0); //創建TCP協議的socket資源 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('socket_create 失敗:'.socket_strerror($socket)); echo '創建成功<br/>'; $restult = socket_connect($socket, $ip, $port); echo '連接成功<br/>'; $in = '創建一個sokcet客服端成功,隨機編號='.rand(1000,9999); if(socket_write($socket, $in, strlen($in))) { echo '發送成功,發送信息為'.$in.'<br/>'; } else { echo '發送失敗,原因為'.$socket_strerror($socket).'<br/>'; } while($out = socket_read($socket, 8192)) { echo '接收信息成功,信息為'.$out.'<br/>'; } echo 'socket關閉<br/>'; socket_close($socket); echo '關閉完成<br/>';
6、開啟客服端
7、使用客戶端連接服務端
服務端狀態:
到這裡socket的基本連接就差不多了。
8、相關行數介紹
8.1、socket_create
用於創建一個socket資源,成功返回一個套接字,失敗返回false;
詳情參考:http://www.php.net/manual/zh/function.socket-create.php
8.2、socket_bind
綁定一個名稱到socket,成功返回true,失敗返回時false;
詳情參考:http://php.net/manual/en/function.socket-bind.php
8.3、socket_listen
監聽一個socket資源,成功返回true,失敗返回時false;
詳情參考:http://php.net/manual/zh/function.socket-listen.php
、
8.4、socket_accept
合法創建一個子socket,成功返回一個新的socket資源,失敗返回false;
詳情參考:http://www.php.net/manual/en/function.socket-accept.php
8.5、socket_read
讀取客服端發送的信息,成功返回讀取的信息,否則返回空字元串
(socket_read() returns a zero length string ("") when there is no more data to read.)
詳情參考:http://www.php.net/manual/en/function.socket-read.php
8.6、socket_write
想socket寫入數據到緩存
詳情參考:http://php.net/manual/en/function.socket-write.php
8.7、socket_close
關閉socket資源
詳情參考:http://php.net/manual/zh/function.socket-close.php
8.8、socket_strerror
獲取錯誤信息
詳情參考:http://php.net/manual/zh/function.socket-strerror.php