php - 在 PHP 5.x 中使用 fsockopen 循环 Fget

标签 php python sockets tcp fgets

我有一个 Python 服务器终于可以工作并通过输出响应多个命令,但是我现在遇到了 PHP 接收完整输出的问题。我已经尝试过 fgets、fread 等命令,唯一似乎有效的命令是“fgets”。

然而这只接收在线数据,然后我创建了如下所示的 while 语句:

 while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
}

然而,Python 服务器似乎没有在输出末尾发送 Feof,因此 php 页面超时并且不显示任何内容。就像我上面说的,只运行 echo fgets($handle),工作正常,输出一行,再次运行命令,两者都不会显示下一行 e.t.c

我在下面附上了我的 Python 脚本的重要部分:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", port))
s.listen(5)
print "OK."
print "  Listening on port:", port
import subprocess
while 1:
    con, addr = s.accept()
    while True:
        datagram = con.recv(1024)
        if not datagram:
            break
        print "Rx Cmd:", datagram
        print "Launch:", datagram
        process = subprocess.Popen(datagram+" &", shell=True, stdout=subprocess.PIPE)
        stdout, stderr = process.communicate()
        con.send(stdout)
    con.close()
s.close()

我还附上了完整的 PHP 脚本:

<?php
$handle = fsockopen("tcp://xxx.xxx.xxx.xxx",12345);
fwrite($handle,"ls");
echo fgets($handle);
fclose($handle);
?>

谢谢, 阿什莉

最佳答案

我相信您需要稍微修复一下您的服务器代码。我已经删除了内部 while 循环。您的代码的问题是服务器从未关闭连接,因此 feof 从未返回 true。

我还删除了 + "&" 位。要获得输出,您需要等到进程结束。而且我不确定 shell 在这种情况下如何处理 &

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", port))
s.listen(5)
print "OK."
print "  Listening on port:", port
import subprocess
try:
    while 1:
        con, addr = s.accept()
        try:
            datagram = con.recv(1024)
            if not datagram:
                continue
            print "Rx Cmd:", datagram
            print "Launch:", datagram
            process = subprocess.Popen(datagram, shell=True, stdout=subprocess.PIPE)
            stdout, stderr = process.communicate()
            con.send(stdout)
        finally:
            print "closing connection"
            con.close()
except KeyboardInterrupt:
    pass
finally:
    print "closing socket"
    s.close()

顺便说一句,您需要在 php 脚本中使用 while 循环。 fgets 只返回一行。

关于php - 在 PHP 5.x 中使用 fsockopen 循环 Fget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1024370/

相关文章:

c# - TCPClient套接字错误0x80004005的原因

node.js - 尝试将 Socket.io 连接到 Express 应用程序时,服务器响应 404

php - 如何从 php 运行 Python 脚本

php - 使用 memcached 存储桶掌握 Couchbase

python - 全局变量不会改变

python - Tensorflow 神经网络的简单回归误差非常高

Java SSLSockets 和重复攻击

PHP:如何通过 sprintf() 添加前导零/零填充以 float ?

php - Flash 和 MySql 之间通信的有效方法?

python - PyVirtualDisplay属性错误: 'Display' object has no attribute 'old_display_var'