PHP套接字服务器如何接受与多个客户端的连接和通信(android)

PHP套接字服务器如何接受与多个客户端的连接和通信(android),php,sockets,socketserver,Php,Sockets,Socketserver,我有一个PHP套接字服务器,需要与多个客户端通信。我知道如果(socket\u listen($sock,5)侦听5个客户端,但当我尝试连接第二个设备时,它没有连接,就像第一个设备的连接阻塞了其他连接一样 当服务器和客户端通信时,由于某种原因连接关闭时,我也会遇到问题,如果我再次尝试连接同一设备或其他设备,它将无法工作。然后我需要重新启动服务器,以便它能够再次接受连接 <?php require "init.php"; $sql = "SELECT * FROM `info` where

我有一个PHP套接字服务器,需要与多个客户端通信。我知道
如果(socket\u listen($sock,5)
侦听5个客户端,但当我尝试连接第二个设备时,它没有连接,就像第一个设备的连接阻塞了其他连接一样

当服务器和客户端通信时,由于某种原因连接关闭时,我也会遇到问题,如果我再次尝试连接同一设备或其他设备,它将无法工作。然后我需要重新启动服务器,以便它能够再次接受连接

<?php
require "init.php";
$sql = "SELECT * FROM `info` where sent = 0 order by id desc";

error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);

/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush();

$address = '192.168.50.30';
$port = 3005;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if(socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if(socket_listen($sock, 5) === false) {
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Send Welcome. */
    $msg = "HELLO".chr(0);
    socket_write($msgsock, utf8_encode ($msg), strlen($msg));


    do {

        $result = $con->query($sql);
        $row = $result->fetch_assoc();

        if(!empty($row["Token"])){
            $msg = $row["Token"]. chr(0);

            socket_write($msgsock, utf8_encode($msg), strlen($msg));
            $result = $con->query("update info set sent = 1 where id = ".$row["id"]);
        }


//        $talkback = $_SERVER['REMOTE_ADDR']." Said: '$buf'.\n".chr(0);
//        socket_write($msgsock, $talkback, strlen($talkback));
    } while (true);
    socket_close($msgsock);
} while (true);

socket_close($sock);
?>

php是单线程的,因此不能同时为多个套接字服务。您可以尝试使用.or。但是您应该认真考虑以支持并发性的另一种语言来实现这一点。PHP实际上是围绕请求/响应周期而不是长时间运行的服务器设计的。如果您所做的只是将数据库值放在TCP连接上。ion你有很多选择。@Peter你告诉我,我需要用另一种编程语言来制作服务器,这样我就可以为多个套接字提供服务了?你有什么建议或一些示例服务器演示源代码吗?我现在只知道PHP和一点Java。你可以看看reactphp,这可以解决你的问题不,你知道吗不必使用其他语言。我只是说PHP不适合此任务。在我之前的评论中,我建议了两种在PHP中工作的方法。Reactphp是另一种方法,尽管据我记忆所及,数据库查询仍然会阻塞。