PHP - 一個簡單的socket通信

簡單來說,服務端創建socket,用戶端連接此socket併發送數據。

  • 服務端創建socekt的過程:
    socket_create():創建一個socket
    socket_bind():綁定一個地址
    socket_listen():監聽這個socket
    socket_accept():接收socket通信數據
    socket_read():讀取通信數據
    socket_write():返回給客戶端的數據
  • 客戶端連接一個socket服務
    socket_create():創建一個socket
    socket_connect():連接服務端的socket套接字,使客戶端與服務端建立聯繫
    socket_write():向服務端寫入字符串
    socket_read():讀取服務端的返回

服務端:

<?php
// 創建服務端的socked套接流,net協議爲IPv4,protocol協議爲TCP
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 綁定接收的套接流主機和端口,與客戶端對應
if (socket_bind($socket, '127.0.0.1', 8888) == false) {
    echo 'Server bind fail :'.socket_strerror(socket_last_error());
}

// 監聽套接流
if (socket_listen($socket, 4) == false) {
    echo 'Server listen fail :'.socket_strerror(socket_last_error());
}

// 讓服務器無現獲取客戶端傳過來的信息
do {
    // 接收客戶端傳過來的信息
    $accept_resource = socket_accept($socket);

    if ($accept_resource !== false) {
        // 讀取客戶端傳過來的資源,並轉化爲字符串
        $string = socket_read($accept_resource, 1024);

        // PHP_EOL PHP的換行預定義常量
        echo 'Server receive is :'.$string.PHP_EOL;

        if ($string != false) {
            $return_client = 'Server receive is :'.$string.PHP_EOL;

            // 向 socket_accept 的套接流寫入信息,也就是回饋信息給 socket_bind() 所綁定的主機客戶端
            socket_write($accept_resource, $return_client, strlen($return_client));
        } else {
            echo 'Socket_read is fail';
        }

        socket_close($accept_resource);
    }
} while (true);
socket_close($socket);

客戶端:

<?php

// 創建一個socket套接流
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 設置一個socket鏈接選項,這兩個步驟你可以省略
// 接收套接流的最大超時時間1s,後面是微秒單位超時時間,設置爲零,表示不管它
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>1, "usec"=>0));
// 發送套接流的最大超時時間爲6s
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>6, "usec"=>0));

// 連接服務端的套接流,這一步就是使客戶端與服務端的套接流建立聯繫
if (socket_connect($socket, '127.0.0.1', 8888) == false) {
    echo 'Connect fail message :'.socket_strerror(socket_last_error());
} else {
    $message = 'I love you socket!';

    // 向服務端寫入字符串信息
    if(socket_write($socket, $message, strlen($message)) == false) {
        echo 'Fail to write '.socket_strerror(socket_last_error());
    } else {
        echo 'Client write success'. PHP_EOL;
        // 讀取服務端返回來的套接流信息
        while (socket_read($socket, 1024)) {
            $callback = socket_read($socket, 1024);
            echo 'Server return message is :'.PHP_EOL.$callback;
        }
    }
}
// 工作完畢,關閉套接流
socket_close($socket);

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章