我目前正在编写一个使用管道和套接字的基本 python 脚本。管道当前保存来自 html 表单的传入数据,套接字建立与服务器的连接,以不同的时间间隔发送 TCP/IP 命令。表单和服务器位于同一 LAN 但不同的计算机上。
我的代码如下:
#!/usr/bin/env python
import os,sys,time
from socket import *
HOST = 'xxx.xxx.xxx.xxx'
PORT = 6000
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
count = 0
pipe_name = 'testpipe'
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)
def readpipe():
pipein = open(pipe_name, 'r')
line = pipein.readline()[:-1]
print line
pipein.close()
def readTCP():
data = tcpCliSock.recv(BUFSIZ)
print data
while count == 0:
readTCP()
readpipe()
我意识到 count 变量目前是多余的,我一直在使用它来尝试调试一些早期的问题
正如您所看到的,代码非常简单,只要数据首先进入管道然后进入套接字并保持此模式即可工作。问题是它不是动态运行这两个函数。它在等待套接字管道输入时挂起。我试图找到一种方法来识别管道或套接字上是否没有数据,然后它可以关闭并检查另一个。到目前为止我所尝试的一切都没有效果,例如检查空字符串。
我在下面的帖子中发现了一些有趣的东西,但它似乎与我正在做的事情(使用标准输入)有很大不同,所以我不确定这是否是我真正想要的东西或者是否可以对其进行调整;
Visit 判断 Python 程序是否可以从 stdin 读取任何内容的最佳方法是什么? https://stackoverflow.com/questions/699390/whats-the-best-way-to-tell-if-a-python-program-has-anything-to-read-from-stdin
根据“用户”的建议,我现在整理了一些附加代码:
while True:
inputdata,outputdata,exceptions = select.select([tcpCliSock],[],[])
if tcpCliSock in inputdata:
data = tcpCliSock.recv(BUFSIZ)
print data
尽管这有效,但我无法发现将什么标识符放入管道的输入数据中。我已经阅读了选择模块,显然它确实可以与管道一起使用,但关于它的信息似乎很少,它都是联网的东西。
我尝试了以下方法(取自上面的主代码):
testpipe
pipe_name
pipein
但我收到各种错误,其中大部分与名称错误 - 未定义 or 类型错误:参数必须是 int,或者具有 fileno() 方法