php tcp服务器问题,一会就链接不上

下面代码一会功夫,客户端就连不上了。


```php
<?php
header("Content-Type:text/html;charset=utf-8");
//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address = "";
$port = 1456;
/**
 * 创建一个SOCKET
 * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6
 * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() fail:" . socket_strerror(socket_last_error()) . "/n");
//阻塞模式
socket_set_block($sock) or die("socket_set_block() fail:" . socket_strerror(socket_last_error()) . "/n");
//绑定到socket端口
$result = socket_bind($sock, $address, $port) or die("socket_bind() fail:" . socket_strerror(socket_last_error()) . "/n");
//开始监听
$result = socket_listen($sock, 4) or die("socket_listen() fail:" . socket_strerror(socket_last_error()) . "/n");
echo "OK\nBinding the socket on $address:$port ... ";
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";
do { // never stop the daemon
  //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
  $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
  while(true){
    //读取客户端数据
    //echo "wait data \n";
    //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
    $buf = socket_read($msgsock, 8129);
    if($buf==""){
        //echo "No data \n";
        //sleep for 10 seconds
        // usleep(10000000);
        //echo date('H:i:s');
        // echo "\n";
    }        
    else {
        echo "Received data \n";
        echo date('H:i:s');
        $myfile = fopen("ddbm.xml", "w") or die("Unable to open file!");
        fwrite($myfile, $buf);
        fclose($myfile);
    }
    // if($buf == "bye"){
    //   //接收到结束消息,关闭连接,等待下一个连接
    //   socket_close($msgsock);
    //   continue;
    // }
}
while(true);
//socket_close($sock);
?>

```

#####如果我的回答对你有帮助,请点击旁边的采纳按钮,谢谢

可参考: TCP 连接断连问题剖析_邦涛的博客-CSDN博客 TCP 连接的保持并不需要任何额外的操作,但在实际应用中,要长时间保持一个 TCP 连接则会受到诸多因素的影响。本文介绍了几种常见的导致 TCP 连接断连的原因,并在此基础上,以 AIX 系统上 TCP 连接的异常断连为例,借助相应的网络分析工具,逐步揭开 AIX 上 TCP 断连的原因,并给出两种可行的解决方案。 https://blog.csdn.net/zhoubangtao/article/details/51160457

可能是:
1.网络问题(差)
2.防火墙问题(没开端口)
3.保护软件(拦截)
4.5.6.……见链接

检查防火墙开了相关端口沒

具体要跟踪调试一下,因为不知道你的运行平台和环境
如果有兴趣可以看看这个
物联网即时通信架构实现与实战-1-物联网即时通信架构实现与实战介绍-可用行师的在线视频教程 掌握网络编程,掌握物联网硬件通信,掌握socket编程 https://edu.csdn.net/course/detail/35439

socket_accept($sock) 你这样的写法只能处理单个请求
请参考如下来处理,非阻塞的方式来处理
<?php
$clients = array();
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'127.0.0.1',$port);
socket_listen($socket);
socket_set_nonblock($socket);

while(true)
{
if(($newc = socket_accept($socket)) !== false)
{
echo "Client $newc has connected\n";
$clients[] = $newc;
}
}
?>