在远程套接字服务器中作为客户端连接
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 中作为客户端连接。
我需要构建一个简单的 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 中作为客户端连接。