php編寫TCP和UDP

功能描述

用php語言實現tcp和udp服務和客戶端,能進行互相通訊php

TCP和UDP簡介

  • TCP:可靠,傳輸大小無限制,可是須要時間來創建鏈接,差錯控制開發大;主要用於文本、程序等可靠性高的數據傳輸。
  • UDP:不可靠,傳輸大小限制在1472字節如下,不須要創建鏈接,差錯控制開銷小;主要用於相似圖像、聲音、網絡遊戲、視頻會議等等對可靠性要求沒有那麼高的業務進行傳輸。

建立TCP服務

  • 方案一: 用socket方式
/**
* socket tcp服務器建立
* @param  string  $ip        IP地址
* @param  string  $port      端口號
* @param  string  $send_msg  返回給客戶端的數據
* @param  integer $recv_len  一次獲取的數據長度
* @return void               void
*/
function socket_tcp_server($ip='0.0.0.0', $port='6000', $send_msg='hello word', $recv_len=1024)
{
    $serv = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or exit(socket_last_error()); //建立
    socket_bind($serv, $ip, $port) or exit(socket_last_error());    //綁定
    socket_listen($serv,4) or exit(socket_last_error());        //監聽
    while(true){

        if ($cli = socket_accept($serv)) { //獲取客戶端鏈接
            
            $data = '';        //接收數據
            while($msg = socket_read($cli,$recv_len)){

                $data .= $msg;
                if (strlen($msg)<$recv_len || stripos($msg,'exit')!==false || stripos($msg,"\n")!==false) break; //數據邊界處理
                
            }

            //socket_getpeername($cli, $cli_addr, $cli_port); //獲取客戶端socket信息
            socket_getsockname($cli, $cli_addr, $cli_port); //獲取客戶端socket信息
        
            echo "CLI: data:{$data},from:{$cli_addr},port:{$cli_port}".PHP_EOL;    //處理數據

            socket_write($cli, $send_msg, strlen($send_msg));    //向客戶端發送數據
            
            socket_close($cli);

            
        } else {
            usleep(1000);
        }
        die;
        
    }

    socket_close($serv);
}

//socket_tcp_server(); // 使用
  • 方案二:用stream_socket_server
/**
* php socket tcp服務器建立
* @param  string  $ip        IP地址
* @param  string  $port      端口號
* @param  string  $send_msg  返回給客戶端的數據
* @param  integer $recv_len  一次獲取的數據長度
* @return void               void
*/
function php_tcp_server($ip='0.0.0.0', $port='6000', $send_msg='hello word', $recv_len=1024)
{
    $serv = stream_socket_server("tcp://{$ip}:{$port}", $errno, $error); //建立
    $errno and exit($error);
    while(true){

        if ($cli = stream_socket_accept($serv)) {    //接收客戶端鏈接
            $data = '';
            while($msg = fread($cli, $recv_len)){    //讀取客戶端數據
                $data .= $msg;
                if (strlen($msg)<$recv_len || stripos($msg,'exit')!==false || stripos($msg,"\n")!==false) break; //數據邊界處理
            }
            $peer = stream_socket_get_name($cli, true);    //獲取客戶端信息
            echo "CLI: data:{$data},peer:{$peer}".PHP_EOL;

            fwrite($cli, $send_msg, strlen($send_msg));    //向客戶端發送數據

            //stream_socket_shutdown($cli, STREAM_SHUT_WR); //關閉客戶端鏈接
            fclose($cli);
        } else {
            usleep(1000);
        }
    }

    //stream_socket_shutdown($serv, STREAM_SHUT_WR);
    fcloe($serv);

}

//php_tcp_server();

TCP客戶端

  • 方案一: socket方式
/**
* socket tcp客戶端
* @param  string $ip    IP地址
* @param  string $port  端口號
* @param  string $data  發送的數據
* @return string        傳遞過來的數據
*/
function socket_tcp_client($ip='127.0.0.1', $port='6000', $data='hello word')
{ 
    $cli = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //建立
    socket_connect($cli, $ip, $port);    //連接
    socket_write($cli, $data, strlen($data)); //發送數據
    $msg = socket_read($cli, 1024); //讀取服務端數據
    socket_close($cli); //關閉
    return $msg;    //處理數據
}

//echo socket_tcp_client('127.0.0.1',6000,'nihao');
  • 方案二:stream_socket_client
/**
* php socket tcp客戶端
* @param  string $ip    IP地址
* @param  string $port  端口號
* @param  string $data  發送的數據
* @return string        傳遞過來的數據
*/
function php_tcp_client($ip='127.0.0.1', $port='6000', $data='hello word')
{
    $cli = stream_socket_client("tcp://{$ip}:{$port}", $errno, $error);
    $error and exit($error);
    fwrite($cli, $data, strlen($data));

    $recv_data = '';
    while($msg = fread($cli, 1024)){
        $recv_data .= $msg;
    }

    stream_socket_shutdown($cli, STREAM_SHUT_WR);

    return $recv_data;
}
//echo php_tcp_client();

UDP服務端

  • 方案一:用socket方式
/**
* socket udp服務器建立
* @param  string  $ip        IP地址
* @param  string  $port      端口號
* @param  string  $send_msg  返回給客戶端的數據
* @param  integer $recv_len  一次獲取的數據長度
* @return void               void
*/
function socket_udp_server($ip='0.0.0.0', $port='6000', $send_msg='hello word', $recv_len=1024)
{
    $serv = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or exit(socket_last_error());
    socket_bind($serv, $ip, $port) or exit(socket_last_error());

    while(true){
        socket_recvfrom($serv, $data, $recv_len, 0, $from, $port);  //獲取客戶端數據 data IP地址 from 端口號 port
        echo "CLI: data:{$data},from:{$from},port:{$port}".PHP_EOL;

        socket_sendto($serv, $send_msg, strlen($send_msg), 0, $from, $port); //向客戶端發送數據
    }

    socket_close($serv);
}

//socket_udp_server('0.0.0.0',6001);
  • 方案二:用stream_socket_server
/**
* php socket udp服務器建立
* @param  string  $ip        IP地址
* @param  string  $port      端口號
* @param  string  $send_msg  返回給客戶端的數據
* @param  integer $recv_len  一次獲取的數據長度
* @return void               void
*/
function php_udp_server($ip='0.0.0.0', $port='6001', $send_msg='hello word', $recv_len=1024)
{
    $serv = stream_socket_server("udp://{$ip}:{$port}", $errno, $error,STREAM_SERVER_BIND);
    $errno and exit($error);
    while(true){

        $data = stream_socket_recvfrom($serv, 1024, 0, $peer);
        echo "CLI: data:{$data},peer:{$peer}".PHP_EOL;

        stream_socket_sendto($serv, $send_msg, 0, $peer);
    }

    stream_socket_shutdown($serv, STREAM_SHUT_WR);
}

//php_udp_server();

UDP客戶端

  • 方案一: socket方式
/**
    * socket udp客戶端
    * @param  string $ip    IP地址
    * @param  string $port  端口號
    * @param  string $data  發送的數據
    * @return string        傳遞過來的數據
    */
function  socket_udp_client($ip='127.0.0.1', $port='6000', $data='hello word')
{
    $cli = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or exit(socket_last_error());
    socket_sendto($cli, $data, strlen($data), 0, $ip, $port) or exit(socket_last_error()); //發送數據
    socket_recvfrom($cli, $data, 1024, 0, $ip, $port) or exit(socket_last_error());    //獲取數據
    socket_close($cli);
    return $data;
}

//echo socket_udp_client('127.0.0.1',6001);
  • 方案二: stream_socket_client
/**
* php socket udp客戶端
* @param  string $ip    IP地址
* @param  string $port  端口號
* @param  string $data  發送的數據
* @return string        傳遞過來的數據
*/
function php_udp_client($ip='127.0.0.1', $port='6001', $data='hello word')
{
    $cli = stream_socket_client("udp://{$ip}:{$port}", $errno, $error);
    $error and exit($error);
    fwrite($cli, $data);
    $data = fread($cli, 1024);
    //stream_socket_shutdown($cli, STREAM_SHUT_WR);
    fclose($cli);
    return $data;
}

//echo php_udp_client();
相關文章
相關標籤/搜索