温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP 下 Socket 编程的应用

发布时间:2021-06-18 15:45:02 来源:亿速云 阅读:183 作者:chen 栏目:编程语言

这篇文章主要介绍“PHP 下 Socket 编程的应用”,在日常操作中,相信很多人在PHP 下 Socket 编程的应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP 下 Socket 编程的应用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Socket 并不是一个协议, 其本质是对 TCP/IP 协议进行的封装, 并对外提供了一组接口, 允许用户可以自由的按相关协议组装数据, 与服务器进行交互. 一切基于 TCP/IP 的协议可以通过 Socket 进行实现.

PHP 通过 Socket 扩展也可以实现对 Socket 编程. 使用 PHP 进行 Socket 通信的简单过程如下:

PHP 下 Socket 编程的应用

PHP Socket 编程涉及的主要函数:

socket_create(): 初始化一个socket资源
socket_bind(): 将socket资源绑定到指定地址
socket_listen(): 监听socket的连接请求
socket_accept(): 接受来自客户端的连接, 返回一个新socket资源用于通讯. 如果接收到多个连接, 只会使用第一个连接. 没有连接时, 该函数保持堵塞状态, 直到有新的连接. 如果使用socket_set_blocking() or socket_set_nonblock()将socket设置为非堵塞状态, 没有连接时该函数返回FALSE
socket_read(): 从连接资源中读取指定字节数的数据, 读取成功时, 返回字符串. 失败时, 返回FALSE. 没有数据时, 返回空字符串
socket_write(): 向连接资源写入信息返回给客户端
socket_strerror(): 根据错误号获取错误消息
socket_last_error(): 返回上一次错误的错误号

示例一: 客户端和服务端的一对一通信, 由客户端推送数据到服务端

client.php

$host = '127.0.0.1';
$port = 65533;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
exit('初始化socket资源错误: ' . socket_strerror(socket_last_error($sock)));
}
 
if(socket_connect($sock, $host, $port) === FALSE)
{
exit('连接socket失败: ' . socket_strerror(socket_last_error($sock)));
}
 
$msg = '客户端1消息';
if(socket_write($sock, $msg) === FALSE)
{
exit('发送数据失败: ' . socket_strerror(socket_last_error($sock)));
}
 
$data = '';
// 循环读取指定长度的服务器响应数据
while($response = socket_read($sock, 4))
{
$data .= $response;
}
echo $data . PHP_EOL;
 
socket_close($sock);

server.php

set_time_limit(0);
 
$ip = '127.0.0.1';
$port = '65533';
$count = 1;
// socket_create(): 初始化一个socket资源
// socket_strerror(): 根据错误号获取错误消息
// socket_last_error(): 返回上一次错误的错误号
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
echo '初始化socket失败: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_bind(): 将socket资源绑定到指定地址
if(!socket_bind($sock, $ip, $port))
{
echo '绑定端口失败: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_listen(): 监听socket的连接请求
if(!socket_listen($sock))
{
echo '监听端口: ' . socket_strerror(socket_last_error($sock));
die;
}
 
while(1)
{
// socket_accept(): 接受来自客户端的连接, 返回一个新socket资源用于通讯. 如果接收到多个连接, 只会使用第一个连接. 没有连接时, 该函数保持堵塞状态, 直到有新的连接. 如果使用socket_set_blocking() or socket_set_nonblock()将socket设置为非堵塞状态, 没有连接时该函数返回FALSE
;
if(($client = socket_accept($sock)) === FALSE)
{
echo '接收连接失败: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_read(): 从连接资源中读取指定字节数的数据, 读取成功时, 返回字符串. 失败时, 返回FALSE. 没有数据时, 返回空字符串
$content = socket_read($client, 1024);
if($content !== FALSE)
{
echo '消息' . $count . ': ' . $content . PHP_EOL;
$count++;
$response = '接收信息成功!';
// socket_write(): 向连接资源写入信息返回给客户端
socket_write($client, $response);
socket_close($client);
}else
{
exit('读取数据错误: ' . socket_strerror(socket_last_error($client)));
}
}
 
socket_close($sock);

首先在命令行下启动 server.php, 然后启动 client.php.

服务消息提示:

PHP 下 Socket 编程的应用

客户端接收的响应消息提示

PHP 下 Socket 编程的应用

客户端接收到服务端的响应消息后将断开连接, 而服务端会一直挂起, 等待下一次的连接.

示例二: 客户端和服务端的一对一通信, 由服务端推送数据到客户端

client.php

// 服务端地址
$host = '127.0.0.1';
$port = 65533;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
exit('初始化socket资源错误: ' . socket_strerror(socket_last_error($sock)));
}
 
if(socket_connect($sock, $host, $port) === FALSE)
{
exit('连接socket失败: ' . socket_strerror(socket_last_error($sock)));
}
 
$data = '';
// 循环读取指定长度的服务器响应数据
while($response = socket_read($sock, 4))
{
$data .= $response;
}
socket_write($sock, '接收消息成功');
echo $data . PHP_EOL;
 
socket_close($sock);

server.php

set_time_limit(0);
 
$ip = '127.0.0.1';
$port = '65533';
// socket_create(): 初始化一个socket资源
// socket_strerror(): 根据错误号获取错误消息
// socket_last_error(): 返回上一次错误的错误号
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
echo '初始化socket失败: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_bind(): 将socket资源绑定到指定地址
if(!socket_bind($sock, $ip, $port))
{
echo '绑定端口失败: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_listen(): 监听socket的连接请求
if(!socket_listen($sock))
{
echo '监听端口: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// 建立死循环,循环接收客户端的连接请求,持续向连接上的客户端推送消息
while(1)
{
// socket_accept(): 接受来自客户端的连接, 返回一个新socket资源用于通讯. 如果接收到多个连接, 只会使用第一个连接. 没有连接时, 该函数保持堵塞状态, 直到有新的连接. 如果使用socket_set_blocking() or socket_set_nonblock()将socket设置为非堵塞状态, 没有连接时该函数返回FALSE
;
if(($client = socket_accept($sock)) === FALSE)
{
echo '接收连接失败: ' . socket_strerror(socket_last_error($sock));
die;
}
$data = '服务端消息: ' . date('Y-m-d H:i:s', time());
socket_write($client, $data);
socket_close($client);
}
 
socket_close($sock);

首先通过命令行启动 server.php, 此时服务端将挂起, 持续监听指定端口. 然后启动 client.php, 客户端发起连接, 连接成功后, 将接收到服务端推送的数据.

客户单响应提示:

PHP 下 Socket 编程的应用

到此,关于“PHP 下 Socket 编程的应用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI