用php實現一個簡單的socket傳輸

涉及到兩部分, client和server,  分如下步驟:php

 

1,client和server兩邊都先建立,綁定。bash

2,server進行監聽,讀取從client傳過來的信息。服務器

3,client發信息socket

4,server收到來自client信息this

5,server寫信息,發送回去編碼

6,client收到來自server的信息code

 

代碼:orm

建立兩個文件,一個server.php, 一個client.php,以下:server

server部分資源

<?php
/**
 * Created by PhpStorm.
 * User: c80k2
 * Date: 19-3-28
 * Time: 下午5:11
 */

//服務端主機
$serverHost = '127.0.0.1';
//服務端端口
$serverPort = 1235;
//緩衝區長度(能存放多少個客戶端請求)
$serverBackLog = 3;

$receiveStrLength = 1024;

//建立服務端的socket套接流,net協議爲IPv4,protocol協議爲TCP
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
    OR DIE('server create fail:'.socket_strerror(socket_last_error()));

//綁定接收的套接流主機和端口
socket_bind($serverSocket, $serverHost, $serverPort)
    OR DIE('server bind fail:'.socket_strerror(socket_last_error()));

//監聽套接流
socket_listen($serverSocket, $serverBackLog)
    OR DIE('server listen fail:'.socket_strerror(socket_last_error()));

echo 'server is listening';

//讓服務器無限獲取客戶端傳過來的信息
do {
    /*接收客戶端傳過來的信息*/
    /*socket_accept的做用就是接受socket_bind()所綁定的主機發過來的套接流*/
    $acceptResource = socket_accept($serverSocket)
        OR DIE('server listen fail:'.socket_strerror(socket_last_error()));

    /*讀取客戶端傳過來的資源,並轉化爲字符串*/
    $receivedStr = socket_read($acceptResource, $receiveStrLength)
        OR DIE('server listen fail:'.socket_strerror(socket_last_error()));
    /*socket_read的做用就是讀出socket_accept()的資源並把它轉化爲字符串*/

    $returnStr = 'server received string : '.$receivedStr.PHP_EOL;
    echo $returnStr;

    /*向socket_accept的套接流寫入信息,也就是回饋信息給socket_bind()所綁定的主機客戶端*/
    socket_write($acceptResource, $returnStr, strlen($returnStr));
    /*socket_write的做用是向socket_create的套接流寫入信息,或者向socket_accept的套接流寫入信息*/

    /*socket_close的做用是關閉socket_create()或者socket_accept()所創建的套接流*/
    socket_close($acceptResource);
} while (true);

client部分

<?php
/**
 * Created by PhpStorm.
 * User: c80k2
 * Date: 19-3-28
 * Time: 下午5:11
 */

$receiveTimeOutSec = 10;
$sendTimeOutSec = 6;

//服務端主機
$serverHost = '127.0.0.1';
//服務端端口
$serverPort = 1235;

//緩衝區長度(能存放多少個客戶端請求)
$receiveStrLength = 1024;

//建立一個socket套接流
$clientSocket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
    OR DIE('client create fail:'.socket_strerror(socket_last_error()));
/****************設置socket鏈接選項*************/
//接收套接流的最大超時時間1秒,後面是微秒單位超時時間,設置爲零,表示無論它
socket_set_option($clientSocket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => $receiveTimeOutSec, "usec" => 0));
//發送套接流的最大超時時間爲6秒
socket_set_option($clientSocket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => $sendTimeOutSec, "usec" => 0));
/****************設置socket鏈接選項*************/

//鏈接服務端的套接流,這一步就是使客戶端與服務器端的套接流創建聯繫
socket_connect($clientSocket, $serverHost, $serverPort)
    OR DIE('client connect fail:'.socket_strerror(socket_last_error()));

$toSendMessage = 'this is a test text';
//轉爲GBK編碼,處理亂碼問題,這要看你的編碼狀況而定,每一個人的編碼都不一樣
//$toSendMessage = mb_convert_encoding($toSendMessage,'GBK','UTF-8');
//向服務端寫入字符串信息

socket_write($clientSocket, $toSendMessage, strlen($toSendMessage))
    OR DIE('client write fail:'.socket_strerror(socket_last_error()));

echo 'client write success'.PHP_EOL;

//讀取服務端返回來的套接流信息
while ($returnMessage = socket_read($clientSocket, $receiveStrLength)) {
    echo 'server return message is:'.PHP_EOL.$returnMessage;
}

socket_close($clientSocket);//工做完畢,關閉套接流

 

實驗

打開兩個終端,先讓server跑起來

php5.6 server.php 
server is listening

再讓client發信息

php5.6 client.php 
client write success

而後看到server收到信息

server received string : this is a test text

而後看到client收到一樣的回覆信息

server return message is:
server received string : this is a test text
相關文章
相關標籤/搜索