PHP-Socket服務端用戶端發送接收通訊執行個體詳解

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.