关键词 TCP/IP、PHP Socket扩展.
相关资料
知乎-PHP 下的 Socket 编程
php中连接tcp服务的三种方式
为什么socket叫套接字
PHP+Socket系列之实现客户端与服务端数据传输
相关函数
socket_create 创建套接字
socket_set_block 设置套接字为阻塞模式
socket_bind 给套接字绑定名字
socket_listen 监听套接字的连接
socket_accept 接受套接字上的连接
socket_read 从套接字中读取最大长度的数据
socket_write 向套接字写数据
socket_close 关闭 Socket 实例
因为项目需求,需要将硬件传递过来的信息整理并记录。而硬件是通过TCP/IP协议进行信息传输,所以需要以PHP作为服务端,接收信息。
服务端代码
<?php
set_time_limit(0);
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE){
echo '初始化socket失败: ' . socket_strerror(socket_last_error($socket));
exit;
}
socket_set_nonblock($socket);
// socket_bind(): 将socket资源绑定到指定地址
if(!socket_bind($socket, '127.0.0.1', 7228)){
echo '绑定端口失败: ' . socket_strerror(socket_last_error($socket));
exit;
}
// socket_listen(): 监听socket的连接请求
if(!socket_listen($socket)){
echo '监听端口: ' . socket_strerror(socket_last_error($socket));
exit;
}
while(1){
if(($client = socket_accept($socket)) !== FALSE){
while(1){
//这里不循环的话,只能接收到一次消息
$content = socket_read($client, 10240);
$content = trim($content);
if($content == 'shutdown'){
socket_close($client);
break 2;
}
if($content){
echo $content . PHP_EOL;
$response = '接收信息成功!';
//如果不给返回,客户端无法再发送消息
socket_write($client, $response);
}
}
}
}
socket_close($socket);
客户端代码
<?php
// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 连接服务端
socket_connect($socket, '127.0.0.1', 7228);
while (true) {
// 让控制台输入内容
fwrite(STDOUT, '请输入内容:');
$in = fgets(STDIN);
// 向服务端发送内容
socket_write($socket, $in);
// 读取服务端发送的消息
$msg = socket_read($socket, 10240);
echo $msg;
}
从代码上看还挺简单的,但是背后还有更复杂的工作原理需要去了解学习。
不了解原理拿来套用哪里出问题都不明白原因,太痛苦了。