不能在Php中创建客户端服务器套接字程序


Can't Create Client Server Socket Program in Php

我正在为聊天应用程序的客户端服务器套接字程序工作,但它给出以下错误消息

警告:socket_bind():无法绑定地址[98]:地址已在使用....无法绑定到第15行的地址

我看过各种教程,但我想让服务器不断地听取客户端的请求。我看到了端口号,它也打开了,但仍然是相同的消息。我在这一点上被困了好几天都没有得到适当的解决方案。请帮忙解决,谢谢.....

Server.php:

 <?php
    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 = 'XXX.XX.XX.XXX';
    $port = 15213;
    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 instructions. */
        $msg = "'nWelcome to the PHP Test Server. 'n" .
            "To quit, type 'quit'. To shut down the server type 'shutdown'.'n";
        socket_write($msgsock, $msg, strlen($msg));
        do {
            if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
                echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "'n";
                break 2;
            }
            if (!$buf = trim($buf)) {
                continue;
            }
            if ($buf == 'quit') {
                break;
            }
            if ($buf == 'shutdown') {
                socket_close($msgsock);
                break 2;
            }
            $talkback = "PHP: You said '$buf'.'n";
            socket_write($msgsock, $talkback, strlen($talkback));
            echo "$buf'n";
        } while (true);
        socket_close($msgsock);
    } while (true);
    socket_close($sock);
    ?>

Client.php

    <?php
error_reporting(E_ALL);
echo "<h2>TCP/IP Connection</h2>'n";
/* Get the port for the WWW service. */
$service_port = getservbyname('www', 'tcp');
/* Get the IP address for the target host. */
$address = gethostbyname('www.example.com');
/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "'n";
} else {
    echo "OK.'n";
}
echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() failed.'nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "'n";
} else {
    echo "OK.'n";
}
$in = "HEAD / HTTP/1.1'r'n";
$in .= "Host: www.example.com'r'n";
$in .= "Connection: Close'r'n'r'n";
$out = '';
echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));
echo "OK.'n";
echo "Reading response:'n'n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}
echo "Closing socket...";
socket_close($socket);
echo "OK.'n'n";
?>

在两个php文件中,您在同一端口上创建一个套接字。这就是问题所在。

服务器必须创建套接字,而客户端必须使用套接字(也不创建它)

两个应用程序不能创建相同的套接字并监听相同的端口。

编辑:

我已经在localhost上用xampp测试了您的脚本。所以IP是127.0.0.1。服务器在端口15213上正常侦听,客户端在该端口上正常连接。我在xampp控制面板上看到端口是打开的。

如果你使用你在这里发布的脚本,那么你必须替换在Server.php

$address = 'XXX.XX.XX.XXX';

$address = '127.0.0.1';

和Client.php

$address = gethostbyname('www.example.com');

$address = gethostbyname('localhost');
or
$address = '127.0.0.1';