早睡早起,方能养生
Sleep early rise early, way to keep healthy

记录一次 PHP socket 简单测试

super
2021-02-28 07:20
views 2090

服务端demo (server.php):

 

<?php
/**
 * Author: super
 * Date: 2021/02/28
 */

// 创建服务器的socket套接流,net协议为IPv4,protocol协议为TCP
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 绑定接收套接流主机及端口
if (socket_bind($socket, '127.0.0.1', 8889) == false) {
    echo "server bind fail:" . socket_strerror(socket_last_error());
}

// 监听套接流
if (socket_listen($socket, 4) == false) {
    echo "server bind fail:" . socket_strerror(socket_last_error());
}

// 无限循环获取客户端传来的信息
do {
    // 接收socket_bind所绑定主机传来的套接流
    $accept_resource = socket_accept($socket);
    if ($accept_resource !== false) {
        // 读取客户端传来的资源. return => success: string || error: false
        $msg = socket_read($accept_resource, 1024);
        if ($msg != false) {
            // 处理客户端数据
            $msg = json_decode($msg, true);
            switch ($msg['type']) {
                case 1:
                    $return_msg = 'i love you too!';
                    break;
                case 2:
                    $return_msg = 'i don\'t love you!';
                    break;
                case 3:
                    $return_msg = 'i\'m your father!';
                    break;
                default:
                    $return_msg = 'server cannot process!';
            }
            $return_client = "server return is :" . $return_msg . PHP_EOL;
            // 向socket_accept套接流写入信息,返回给bind所绑定的客户端
            socket_write($accept_resource, $return_client, strlen($return_client));
        } else {
            echo "socket_read is fail.";
        }
        // 关闭套接流
        socket_close($accept_resource);
    }
} while (true);

 

客户端demo (client.php):

 

<?php
/**
 * Author: super
 * Date: 2021/02/28
 */

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

// 设置接收套接流最大超时时间为1秒,usec为微秒单位超时时间
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 1, 'usec' => 0]);

// 设置发送套接流最大超时时间为6秒
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 6, 'usec' => 0]);

// 连接服务端套接流,使客户端与服务端套接流建立联系
if (socket_connect($socket, '127.0.0.1', 8889) == false) {
    echo "server bind fail:" . socket_strerror(socket_last_error());
} else {
    $message = json_encode(['type' => 1, 'msg' => 'i love you!']);
    // 向套接流写入内容,传输给服务端
    if (socket_write($socket, $message, strlen($message)) == false) {
        echo "write to fail:" . socket_strerror(socket_last_error());
    } else {
        echo "client write success" . "<br/>";
        // 读取服务端返回的套接流信息
        while ($callback = socket_read($socket, 1024)) {
            echo "server return message is :" . PHP_EOL . $callback;
        }
    }
}
// 工作完毕,关闭套接流
socket_close($socket);

 

windows环境测试:

 

1)打开cmd命令行,运行server.php文件

 

 

没有报错,且第二行有光标持续闪烁即为运行成功

 

(报错 PHP 不是内部或外部命令也不是可运行的程序 解决办法

 

(报错 Warning: socket_accept(): unable to accept incoming connection [10022]: 提供了一个无效的参数。 解决办法

 

(报错 Fatal error: Uncaught Error: Call to undefined function socket_create() 解决办法

 

2)运行client.php

 

可新开一个cmd窗口运行,或者在浏览器运行

 



分享
0 条讨论
top