PHP套接字是半工作的

Mos*_*age 7 php sockets chat

所以,我让mIRC在端口1235上进行监听(在这个上跟我一起),我试图制作一个php脚本连接到我的localhost服务器上的这个端口.

我的localhost是一个干净的Apache + PHP,mIRC在另一台计算机(内部局域网)上运行.

该脚本正常工作为:1)它连接到1235端口2)它发送$ i 2.1)但在另一侧没有收到消息(也就是我得到一个袜子读取事件但没有弹出文本)3)它读取所有传入消息correclty 4)它关闭时"结束"是消息 击鼓声 5)它仅适用中频而功能不存在.5.1)又名Inifi加载.它仅在套接字通过'end'关闭时显示回显

这是代码,这是我在php.net上找到的一个简单示例,在此先感谢:)

    <?php
//The Client
error_reporting(E_ALL);

$address = "192.168.1.101";
$port = 1235;

/* 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 "socket successfully created.\n";
}

echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "successfully connected to $address.\n<br>";
}
$allow = true;
$i = 0;
while ($allow == true)
{
    $i++;
    echo "Sending $i to server.\n<br>";
    socket_write($socket, $i, strlen($i));

    $input = socket_read($socket, 2048);
    if ($input == 'end') {
        $allow = false; 
    }
    echo "Response from server is: $input\n";
    sleep(5);
}

echo "Closing socket...";
socket_close($socket);
?>
Run Code Online (Sandbox Code Playgroud)

这是我在浏览器中得到的结论

socket已成功创建.尝试连接到端口'1235'上的'192.168.1.101'...已成功连接到192.168.1.101.将1发送到服务器.来自服务器的响应是:ok来自服务器的响应是:结束

这是在mIRC:

测试:89.152.172.21在!阅读关闭Blockquote

如果我让它工作了一个小时,则将"读取"乘以60并"将N + 1发送到服务器",但这只会在袜子关闭后显示(或通过停止时间)

Kor*_*nel 2

你有“普通”socket_write()socket_read()跟注。不幸的是,套接字函数在设计上是不可靠的(这是从 BSD 套接字继承的行为)。你不能只是调用socket_write()并期望它实际写入字节(听起来很奇怪\xe2\x80\xa6)

\n\n

PHP手动报价:

\n\n
\n

socket_write() 不一定写入给定缓冲区中的所有字节。这是有效的,根据网络缓冲区等,尽管缓冲区更大,但仅写入一定量的数据,甚至一个字节。您必须小心,以免无意中忘记传输其余数据。

\n
\n\n

您必须检查已写入多少字节并不断重试,直到发送完您想要的所有字节。

\n\n

读书也是如此。读取调用可以读取您请求的尽可能多或更少的内容,并且您需要重试该调用。

\n\n

确保将套接字设置为阻塞,然后循环调用读/写,或者使用(同样糟糕的)select()调用来查找哪些套接字可能有一些数据或可能已完成发送。

\n\n
\n\n

如果您想要的 API 不是 PITA,那么请使用具有可靠读/写功能的流。

\n\n

如果您不一定需要 PHP,那么可以看看Node JS,它是专门为具有长期网络连接的程序设计的服务器/环境。

\n