標籤:socket 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、服務端檔案內容:
#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\n"; // 向用戶端傳遞一個資訊資料 if ($buffer != "") { echo "send data to client\n"; socket_write($connection, $buffer . "\n"); echo "Wrote to socket\n"; } else { echo "no data in the buffer\n" ; } // 從用戶端擷取得的資料 while ($data = @socket_read($connection, 1024, PHP_NORMAL_READ)) { printf("Buffer: " . $data . "\n"); //取得資訊給用戶端一個反饋, Thank you client, you data is Received success發給用戶端的回應資訊。 socket_write($connection, "Thank you client, you data is Received success\n"); } } //關閉 socket socket_close($connection); printf("Closed the socket\n"); } ?>
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\n"; break; } else { //服務端傳來的資訊 echo "Buffer Data: " . $buffer . "\n"; echo "Writing to Socket\n"; // 將客戶的資訊寫到通道中,傳給伺服器端 if (!socket_write($socket, "$send_data\n")) { echo "Write failed\n"; } //伺服器端收到資訊後,用戶端接收服務端傳給用戶端的回應資訊。 while ($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) { echo "sent to server:$send_data\n response from server was:" . $buffer . "\n"; } } } ?>
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
本文出自 “張玉坡” 部落格,請務必保留此出處http://fighter.blog.51cto.com/1318618/1533957