php socket_read()函数的问题

本文介绍了在Windows XP环境下,使用PHP进行socket编程时遇到的一个问题。在客户端,socket_read()函数在服务器无数据时似乎陷入了无限循环,未按预期返回false或空字符串。作者分享了服务器端(socket_server.php)和客户端(socket_client.php)的代码,并寻求解决方案。现象可能是由于socket_read()在无数据时的阻塞行为导致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器端文件:socket_server.php:
<?php
phpinfo();

//用WEB打开的时候为了防止网页超时连接,需要设置无限有效
set_time_limit(0);  
/**加载Socket必备的库*/
if(!extension_loaded('sockets')) {
if(strtoupper(substr(PHP_OS, 3)) == “WIN”) {
dl('php_sockets.dll');
}else{
dl('sockets.so');
}
}  

/**---socket服务器端生成---*/
$commonProtocol = getprotobyname("tcp");//使用公共协议名字来获取一个协议类型  
$socket = socket_create(AF_INET,SOCK_STREAM,$commonProtocol);//产生一个socket并且返回一个socket资源的实例  
socket_bind($socket, 'localhost', 1339);//绑定socket到本地计算机
socket_listen($socket);//监听所有进来的socket连接  
/**------END------*/

//初始化缓冲区
$buffer='NO DATA';
while(true){
//产生一个连接
$connection = socket_accept($socket);//其实是一个循环等待的过程
if($connection){
printf("Socket connected\r\n");
socket_write($connection, "You are connecting me,My Load.");
} else{
echo socket_strerror();
exit;
}

//检测缓冲区的内容,有内容就发,没有内容就不发
if($buffer!=""){
printf("Something is in the buffer...sending data...\r\n");
socket_write($connection,$buffer.";");//将缓冲区内容发送到客户端
printf("Wrote to socket\r\n");
}else
{
printf("No Data in the buffer\r\n");
}

//从客户端取得输入数据并把读取的数据放进缓冲区中
while($data = socket_read($connection,1024))//socket_read() 读取指定长度的数据  
{
$buffer = $data;
socket_write($connection,"Information Received\r\n");
printf("Buffer".$buffer."\r\n");
}
//关闭socket连接
socket_close($connection);
printf("Closed the soket\r\n\r\n");
}
?>

客户端文件:socket_client.php:
<?php
// Create the socket and connect
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket,'localhost', 1339);

while(($buffer = socket_read($socket, 10,PHP_BINARY_READ))!==false) {
if($buffer == "NO DATA") {
echo("<p>NO DATA</p>");
break;
}else{
// Do something with the data in the buffer
echo("<p>Buffer Data: " . $buffer . "</p>");
}
}

echo("<p>Writing to Socket</p>");
// Write some test data to our socket
if(!socket_write($socket, "SOME DATA")){
echo("<p>Write failed</p>");
}
// Read any response from the socket
while(($buffer = socket_read($socket, 10,PHP_BINARY_READ))!==false){
echo("<p>Data sent was: SOME DATA<br> Response was:" . $buffer . "</p>");
}
echo("<p>Done Reading from Socket</p>");
?>  
然后用php.exe在命令行执行:
客户端无法正常显示全部应该显示的信息:
"<p>Done Reading from Socket</p>"这个样的最后一句话也没有显示.
好像是在第一个循环的时候卡在socket_read()函数上了,当服务器端没有数据的时候,原本以为应该是返回false但是却在一点反映也没有了,程序也不往下走了,好像在socket_read中有一个无限循环一样,怎么回事!我参考了php文档,有的说返回的是"",有的例子程序说是false,没有办法了,求助,上面的现象是怎么回事?
我的环境是WindowsXP,apache,php5
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值