php专区

 首页 > php专区 > PHP高级 > 缓存异常处理 > php socket编程 读完成后写堵塞

php socket编程 读完成后写堵塞

分享到:
【字体:
导读:
         摘要:php socket编程 读完成后写阻塞server端代码如下: <?php set_time_limit(0); $host="127.0.0.1"; $port=&n...

php socket编程 读完成后写堵塞
php socket编程 读完成后写阻塞
server端代码 如下:

set_time_limit(0);
 
$host = "127.0.0.1";
$port = 12345;
 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socketn"); // 创建一个Socket
 
$result = socket_bind($socket, $host, $port) or die("Could not bind tosocketn"); //绑定Socket到端口
 
$result = socket_listen($socket) or die("Could not set up socket listenern"); // 开始监听连接
 
$spawn = socket_accept($socket) or die("Could not accept incoming connectionn"); // 处理通信

//若换成循环接收数据,客户端将一直处理等待接收状态
$input = socket_read($spawn, 1024) or die("Could not read datan");
/* 
while (( $data = socket_read($spawn, 1024)) != false) 
$input .= $data;
*/ 

echo 'input:', strlen($input), "n";
 
$output = date("Y-m-d H:i:s"). "n"; //处理客户端输入并返回结果
 
echo "output:", $output, "n";
 
// 数据传送 向客户端写入返回结果
socket_write($spawn, $output, strlen($output)) or die("Could not write outputn");
 
// 关闭sockets
socket_close($spawn);
socket_close($socket);


client端, 代码如下:


set_time_limit(0);
 
$host = "127.0.0.1";
$port = 12345;
 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socketn"); // 创建一个Socket
 
$connection = socket_connect($socket, $host, $port) or die("Could not connet servern");    //  连接
 
socket_write($socket, "time") or die("Write failedn"); // 数据传送 向服务器发送消息

echo 'wait for data';

while (($buffer = socket_read($socket, 1024))!=false) {
    echo("Data sent was: timenResponse was:" . $buffer . "n");
}
 
socket_close($socket);

如果将server端对client read操作换成循环内部读取,则client会一直处于 wait data状态。
有办法让server端循环读的情况下,读完后给client写数据吗



socket tcp php server

------解决方案--------------------
你这个循环没有错,但是一次数据发送完成就关闭socket连接了,没有循环的必要吧。
------解决方案--------------------
while (true) {
    $msg = socket_accept ($socket);               // 接受一个SOCKET
    if (!$msg) {
        echo "socket_accept() failed:".socket_strerror ($msg)."n";
        break;
    }
    while (true) {
        $command = strtoupper (trim (socket_read ($msg, 1024))); //等待客户端数据
        if (!$command) break;
        //相关处理,比如直接回显
        socket_write ($msg, $command, strlen ($command));
    }
    socket_close ($msg);
    if ($command == "QUIT") //如果收到的是通讯结束
        break;
}
socket_close ($socket);                   // 关闭SOCKET

------解决方案--------------------
引用:
Quote: 引用:


set_time_limit(0);
 
$host = "127.0.0.1";
$port = 12345;
 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socketn"); // 创建一个Socket
 
$result = socket_bind($socket, $host, $port) or die("Could not bind tosocketn"); //绑定Socket到端口
 
$result = socket_listen($socket) or die("Could not set up socket listenern"); // 开始监听连接
 
$spawn = socket_accept($socket) or die("Could not accept incoming connectionn"); // 处理通信

//若换成循环接收数据,客户端将一直处理等待接收状态
$input = socket_read($spawn, 1024) or die("Could not read datan"); php socket编程 读完成后写堵塞
分享到:
编纂安全 PHP 应用程序的七个习惯
编纂安全 PHP 应用程序的七个习惯 编写安全 PHP 应用程序的七个习惯 提高 Web 应用程序的安全性 PHP 应用程序中的安全性包括远程安全性和本地安全性。本文将揭示 PHP 开发人员在实现具有这两种安全性的 Web 应用程序时应该养成的习惯。 ? 在提及安全性问题时,需要注意,除了实际的平台和操作系统安全性问题之外,您还需要...
如何能知道XML对象中有几个一层的元素 si...
如何能知道XML对象中有几个一层的元素 simplexml_load_file() 怎么能知道XML对象中有几个一层的元素 simplexml_load_file()比如:simplexml_load_file() 后用var_dump()显示如下: 怎么能知道xml中包含几个page ? 下例中page是2个,一个[0],一个[1].  object(SimpleXMLElement)#24 (1)  {  ["page"]=> array(2...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……