在远程套接字服务器中作为客户端连接

Connect as client in a remote socket server

我需要构建一个简单的 PHP 服务套接字以作为客户端与远程套接字服务器连接,然后进行 lintening。问题是我需要连接主机 URL 而不是主机 IP。

我试过 socket_create() 方法,但它只能使用 IP 连接。我尝试过的其他方法是 stream_socket_server() 允许 URL 连接,但我无法保持收听以接收响应。

echo "Socket started...\n";

$server = 'ssl://sockserver.com/moreurl/params?56298';
$host = "sockserver.com";
$port = 80;
set_time_limit(0);

$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$result = socket_connect($socket, $server, $port);
socket_bind($socket, $host);
socket_listen($socket);

while (true) {
  $result = socket_read ($socket, 1024);
  if($result){
    echo "Reply From Server  :".$result;
  }
}

socket_close($socket);

所以,我需要使用 URL 之类的主机作为 PHP 客户端监听远程服务器套接字。

实际上您需要熟悉套接字编程...例如,您的 $ 地址是 URL - 但套接字不理解 URL。您必须使用 IP 地址(对于 AF_INET)或 Unix 套接字路径(对于 AF_UNIX)。

我将为您提供 2 个脚本,一个非常基本的套接字服务器 + 套接字客户端...您可以随意使用它做任何您想做的事情。

服务器:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($socket, '0.0.0.0', 9999);
if (socket_listen($socket)) {
    $nsocket = socket_accept($socket);

    $exit = false;
    while(!$exit && $s = socket_read($nsocket, 100)) {
        $s = trim($s);

        if ($s == 'quit') {
            $exit = true;
            $a = 'Bye';
        }
        else {
            echo 'Received "'.$s.'" from '.$nsocket . PHP_EOL;
            $a = 'You wrote "'.$s.'"';
        }

        socket_write($nsocket, $a."\n");
    }
    socket_write($nsocket, "Bye\n");
    socket_close($nsocket); 
}

客户:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($socket, '127.0.0.1', 9999);
echo '> ';
while( ($data = fgets(STDIN)) && trim($data) != 'quit') {

    if (strlen($data))
        socket_write($socket, $data);
    $answer = '';
    while($ret = socket_read($socket, 1)) { 
        $answer .= $ret;
        if ($ret == "\n") break;
    }
    echo '< '.$answer;
    echo '> ';
}

我使用 ratchetphp/Pawl library at Github 解决了我的问题。此库允许在 WSS 中作为客户端连接。