php编写TCP和UDP

功能描述

用php语言实现tcp和udp服务和客户端,能进行互相通信

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();

你可能感兴趣的:(php,tcp,udp)