如何實現簡單的php socket通信

服務端代碼server.php

<?php
/**

socket通信整個過程

socket_create  //創建一個套接字

socket_bind  //給套接字綁定 ip 和端口

socket_listen //監聽套接字上的連接

socket_accept //接受一個socket連接

socket_read //接收客戶端 發送的數據

socket_write //將數據寫到 socket 緩存 向客戶端發送

socket_close   //關閉套接字資源

 */

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

/**
 * 第一個參數說明:
 *  AF_UNIX(本機通信)
 * AF_INET(TCP/IP – IPv4)
 * AF_INET6(TCP/IP – IPv6)
 * 第二個參數說明:
 *  SOCK_STREAM(TCP流)
 * SOCK_DGRAM(UDP數據報)
 * SOCK_RAW(原始套接字)
 * 第三個參數說明:
 * 如果第二個參數選擇的是TCP,則傳遞SOL_TCP否則就SOL_UDP
 */

if (!$socket) {
    echo 'create socket error' . PHP_EOL;
} else {
    echo 'create socket success' . PHP_EOL;
}

//綁定ip和端口 這裏iP寫爲本機 127.0.0.1 | 有時候需要我們爲 0.0.0.0
$addr = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $addr, $port)) {
    echo 'bind addr success' . PHP_EOL;
} else {
    echo 'bind addr error' . PHP_EOL;
}

//監聽套接字
if (!socket_listen($socket)) {
    echo 'listen socket error' . PHP_EOL;
} else {
    echo 'listen socket success' . PHP_EOL;
}

//接受客戶端連接
$client = socket_accept($socket);

if (!$client) {
    echo 'socket_accept error' . PHP_EOL;
} else {

    echo 'socket_accept success' . PHP_EOL;

    //接受客戶端返回內容
    while (true) {
        //第一個參數是客戶端套接字   第二個參數從socket中獲取的數據 第三個參數是設置長度最多爲 len 字節的數據將被接收。
        $bytesNum = socket_recv($client, $buffer, 100, 0);

        if (!$bytesNum) {
            echo "socket_recv  failed" . PHP_EOL;
            exit(1);
        } else {
            echo "content from client:" . $buffer . PHP_EOL;
        }
    }
}

客戶端代碼client.php

<?php

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

//連接套接字
if (!socket_connect($socket, '127.0.0.1', 8080)) {
    echo 'socket connect error' . PHP_EOL;
    exit(1);
} else {

    while (true) {

        //阻塞進程獲取輸入內容
        $data = fgets(STDIN);

        //如果用戶輸入quit,那麼退出程序 這裏要去除下空格 因爲回車會造成換行符
        if (trim($data) == 'quit') {
            socket_close($socket);
            break;
        }

        //發送數據給服務端
        socket_write($socket, $data);
    }
}

 

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