记录一次 PHP socket 简单测试
super
2021-02-28 07:20
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 条讨论