PHP-Socket服務端客戶端傳送接收通訊例項詳解
Socket介紹
什麼是socket 所謂socket通常也稱作”套接字”,用於描述IP地址和埠,是一個通訊鏈的控制程式碼。應用程式通常通過”套接字”向網路發出請求或者應答網路請求。
在Internet上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟一個Socket,並繫結到一個埠上,不同的埠對應於不同的服務。
Socket連線過程
根據連線啟動的方式以及本地套接字要連線的目標,套接字之間的連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。
(1)伺服器監聽:是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態。
(2)客戶端請求:是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。
(3)連線確認:是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求
socket百科:http://baike.baidu.com/view/13870.htm
1、測試環境:
伺服器ip:192.168.150.1
客戶端ip:192.168.150.2
2、測試過程:
客戶端伺服器將在本機(192.168.150.2)通過socket傳送資料到服務端(192.168.150.2)的socket伺服器上,服務端接收到客戶端傳送的資料後返回一些資訊給客戶端。
3、服務端檔案內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#server.php <?php //獲取tcp協議號碼。 $tcp = getprotobyname ( "tcp" );
// 建立server端socket ,建立並返回一個套接字,也稱作一個通訊節點。一個典型的網路連線由 2 個套接字構成,一個執行在客戶端,另一個執行在伺服器端。 $socket = socket_create(AF_INET, SOCK_STREAM, $tcp );
//繫結要監聽的ip和埠,這裡繫結的ip一定要寫區域網ip,寫成127.0.0.1客戶端將無法與服務端建議連線。 socket_bind( $socket , `192.168.150.1` , 10008);
//監聽埠
socket_listen( $socket );
//初始化一個資料,和客戶端通訊 $buffer = "connect" ;
while (true) {
// 接受客戶端請求過來的一個socket連線
$connection = socket_accept( $socket );
if (! $connection ){
echo "connect faild" ;
} else {
echo "Socket connected ;
// 向客戶端傳遞一個資訊資料
if ( $buffer != "" ) {
echo "send data to client ;
socket_write( $connection , $buffer . " );
echo "Wrote to socket ;
} else {
echo "no data in the buffer ;
}
// 從客戶端獲取得的資料
while ( $data = @socket_read( $connection , 1024, PHP_NORMAL_READ)) {
printf( "Buffer: " . $data . " );
//取得資訊給客戶端一個反饋, Thank you client, you data is Received success發給客戶端的回應資訊。
socket_write( $connection , "Thank you client, you data is Received success );
}
}
//關閉 socket
socket_close( $connection );
printf( "Closed the socket );
} ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
4、客戶端檔案內容: client.php <?php // 建立客戶端的socet連線 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//連線伺服器端socket
$connection = socket_connect( $socket , `192.168.150.1` , 10008);
//要傳送到服務端的資訊。 $send_data = "This data will Send to server!" ;
//客戶端去連線服務端並接受服務端返回的資料,如果返回的資料保護not connect就提示不能連線。 while ( $buffer = @socket_read( $socket , 1024, PHP_NORMAL_READ)) {
if (preg_match( "/not connect/" , $buffer )) {
echo "don`t connect ;
break ;
} else {
//服務端傳來的資訊
echo "Buffer Data: " . $buffer . " ;
echo "Writing to Socket ;
// 將客戶的資訊寫到通道中,傳給伺服器端
if (!socket_write( $socket , "$send_data )) {
echo "Write failed ;
}
//伺服器端收到資訊後,客戶端接收服務端傳給客戶端的回應資訊。
while ( $buffer = socket_read( $socket , 1024, PHP_NORMAL_READ)) {
echo "sent to server:$send_data . $buffer . " ;
}
}
} ?> |
5、在服務端socket服務啟動程式。
#/usr/local/php/bin/php -a /home/server.php
Interactive mode enabled
6、服務端啟動後檢視啟動的程式及埠。
#netstat -tnlp |grep 10008
tcp 0 0 192.168.150.13:10008 0.0.0.0:* LISTEN 28892/php
7、在客戶端(192.168.1.2)上執行傳輸
#/usr/local/php/bin/php -a client.php
Interactive mode enabled
Buffer Data: connect
Writing to Socket
sent to server:This data will Send to server!
response from server was:Thank you client, you data Information Received
8、回到服務端上檢視接收到的資訊。
#/usr/local/php/bin/php -a /home/server.php
Interactive mode enabled
Socket connected
send data to client
Wrote to socket
Buffer: This data will Send to server!
9、參考資料
socket_create()函式需要三個引數:一個協議、一個socket型別、一個公共協議。socket_create()函式執行成功返回一個包含socket的資源型別,如果沒有成功則返回false。
Socket函式
函式名 描述
socket_accept() 接受一個Socket連線
socket_bind() 把socket繫結在一個IP地址和埠上
socket_close() 關閉一個socket資源
socket_connect() 開始一個socket連線
socket_create() 產生一個socket,相當於產生一個socket的資料結構
socket_listen() 監聽由指定socket的所有連線
socket_read() 讀取指定長度的資料
socket_readv() 讀取從分散/聚合陣列過來的資料
socket_send() 這個函式傳送資料到已連線的socket
socket_write() 寫資料到socket快取
socket_writev() 寫資料到分散/聚合陣列
參考文件:http://blog.51yip.com/php/673.html
本文轉自 張玉坡 51CTO部落格,原文連結:http://blog.51cto.com/fighter/1533957
相關文章
- 客戶端與服務端Socket通訊原理詳解客戶端服務端
- Android 客戶端與PC服務端socket通訊接收與傳送圖片(終結者)Android客戶端服務端
- binder通訊例項之c++客戶端與c++服務端C++客戶端服務端
- Java review--NIO例項:實現服務端和客戶端的簡單通訊JavaView服務端客戶端
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- windows socket簡單使用--實現客戶端連結服務端併傳送和接收資料Windows客戶端服務端
- SHA-256加密簡單例項(客戶端、服務端)加密單例客戶端服務端
- zeroc ice 客戶端與服務端通訊例子(c++)客戶端服務端C++
- 客戶端,服務端客戶端服務端
- 服務端,客戶端服務端客戶端
- MQTT協議從服務端到客戶端詳解MQQT協議服務端客戶端
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- [精華][推薦]CAS SSO單點登入服務端客戶端例項服務端客戶端
- java TCP入門程式設計(檔案傳送、服務端接收多個客戶端請求)JavaTCP程式設計服務端客戶端
- HarmonyOS IPC Kit進階:客戶端與服務端的基礎通訊客戶端服務端
- C++20協程例項:攜程化的IOCP服務端/客戶端C++服務端客戶端
- TCP/UDP簡易通訊框架原始碼,支援輕鬆管理多個TCP服務端(客戶端)、UDP客戶端TCPUDP框架原始碼服務端客戶端
- 模板,從服務端到客戶端服務端客戶端
- 服務端渲染和客戶端渲染服務端客戶端
- flutter: 深入通訊-傳送端Flutter
- 遠端客戶端 訪問 ASM 例項客戶端ASM
- Mqtt websocket javascript 客戶端例項MQQTWebJavaScript客戶端
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- Thrift 客戶端-服務端 零XML配置 註解式配置客戶端服務端XML
- 網通dhcp客戶端設定詳解(轉)客戶端
- ZooKeeper服務發現客戶端客戶端
- php原生socket實現客戶端與服務端資料傳輸PHP客戶端服務端
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- golang實現tcp客戶端服務端程式GolangTCP客戶端服務端
- CouchBase C 客戶端介面呼叫例項客戶端
- ElasticSearch客戶端簡單操作例項Elasticsearch客戶端
- Nacos - 客戶端例項列表獲取客戶端
- 從客戶端連線ASM例項客戶端ASM
- BCB 客戶端 tuxedo 開發例項客戶端UX
- 基於node的tcp客戶端和服務端的簡單通訊TCP客戶端服務端
- OutlookAnywhere客戶端配置詳解客戶端