选择.选择套接字和管道的问题



我目前正在编写一个基本的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()

我意识到计数变量目前是多余的,我一直在使用它来尝试调试一些早期的问题

如您所见,代码非常简单,只要数据首先进入管道,然后进入套接字并保持此模式,代码就可以工作。问题是它没有动态地运行这两个函数。它在任一插座管道上等待输入时挂起。我正在尝试找到一种方法来确定管道或插座上是否存在数据,然后它可以关闭并检查另一个。到目前为止,我尝试的所有方法都没有效果,例如检查空字符串。

我在下面的帖子中发现了一些有趣的东西,但它似乎与我正在做的事情(使用 stdin)有很大不同,所以我不确定这是否是我真正想要的,或者是否可以改编;

访问 判断 Python 程序是否有任何内容可以从 stdin(标准)读取的最佳方法是什么?

根据"用户"的建议,我现在整理了一些额外的代码:

while True:
   inputdata,outputdata,exceptions = select.select([tcpCliSock],[],[])
   if tcpCliSock in inputdata:
      data = tcpCliSock.recv(BUFSIZ)
      print data

虽然这有效,但我无法发现将什么标识符放入管道的输入数据中。我已经阅读了选择模块,显然它确实适用于管道,但似乎很少有关于它的信息,它都是联网的东西。我已经尝试了以下内容(取自上面的主代码):

 testpipe
 pipe_name
 pipein

但是我收到各种错误,其中大多数与NameError 有关 - 未定义类型错误:参数必须是 int,或者具有 fileno() 方法

通常你会使用select模块来实现这一点。

import select
sockets_with_read_data, sockets_with_write_data, sockets_with_some_data = 
    select.select([sock, pipe], [], [], timeout = None)

但我不知道这是否适用于管道。

最新更新