Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阻塞recv()返回空行,而不是实际数据_Python_Sockets - Fatal编程技术网

Python 阻塞recv()返回空行,而不是实际数据

Python 阻塞recv()返回空行,而不是实际数据,python,sockets,Python,Sockets,我正在开发一个python客户端,它应该与一个C编程的服务器进行对话。目前,它只回答几个已识别的命令,并带有“ok”(当我使用netcat作为客户端进行测试时,服务器部分工作)。但是我的python客户机只得到了四次ok 1(其余时间都是空行)。我不明白为什么,因为套接字被设置为阻塞,所以我认为它确实收到了一些东西,但我不知道是什么 这是我的。“info”只是一个存储了一些字符串的对象,在循环开始工作之前的所有内容都经过了简化,以便于阅读:我只需要接收一条欢迎消息,然后发送回连接球员的球队名称,

我正在开发一个python客户端,它应该与一个C编程的服务器进行对话。目前,它只回答几个已识别的命令,并带有“ok”(当我使用netcat作为客户端进行测试时,服务器部分工作)。但是我的python客户机只得到了四次ok 1(其余时间都是空行)。我不明白为什么,因为套接字被设置为阻塞,所以我认为它确实收到了一些东西,但我不知道是什么

这是我的。“info”只是一个存储了一些字符串的对象,在循环开始工作之前的所有内容都经过了简化,以便于阅读:我只需要接收一条欢迎消息,然后发送回连接球员的球队名称,然后接收一个位置

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
    print 'Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]
    sys.exit();

try:
    remote_ip = socket.gethostbyname(info.host)
except socket.gaierror:
    print "Hostname could not be resolved. Exiting"
    sys.exit()

s.setblocking(1)
s.settimeout(60)
s.connect((remote_ip, info.port))

data = s.recv(1024)
print data
team = info.team + "\n"
s.sendall(team)
data = s.recv(1024)
print data

while 42:
    msg = raw_input('>> ')
    s.sendall(msg + "\n")
    data = s.recv(1024)
    if data == "":
        break
    else:
        print data

s.shutdown(socket.SHUT_WR)
s.close()

在我看来,您确实收到了一些信息:使用ord()将数据转换为ascii以查看它。我猜在服务器发送给您的响应中,在“ok”之前有3行无法打印。只需识别它们,然后在新的循环中捕获它们。

可能不相关,但如果您想要阻塞行为,实际上不需要设置超时或使用setblocking(1),因为这是默认的套接字行为。它实际上只是增加了复杂性:。另外,您的意思是,只有第一个recv(1024)调用返回“ok”,而所有后续调用都是空的?只是想弄清楚问题到底是什么。是的,锁定和设置超时只是测试而已,我想它没有改变什么,我会删除它们,谢谢你指出。我的意思是,第一次两次recv(1024)调用确实会返回准确的数据,但在循环中,当我通过“原始输入”给出有效命令时,我得到ok,然后接下来的三个命令得到空返回,然后再次ok等等……如果空返回(“”)会破坏while循环,你怎么能得到三个连续的“空返回”?因此,“空返回”似乎与“空返回”不同?调试很困难,因为我们对服务器端实现的细节一无所知。找到错误的方法可能是创建一个简单的python服务器,看看错误是否会复制,否则它可能与C服务器有关。这正是我真正不明白的,我试图在“\n”上打破它,但也不是这样。C服务器使用函数write(同样也使用了dprintf,同样的reults),如果这有帮助的话,netcat客户机也会从中获得预期的行为,这让我认为问题出在我的客户机上。感谢您对python服务器的介绍,我就这么做。然而,这很奇怪,因为套接字只是通用TCP协议的一个实现,根据定义,它应该是平台和语言无关的。也许先试试这个:跳过while循环,只做一个5个原始输入的序列,看看错误是否仍在复制……所以服务器在ok前后向我发送了一大堆零。一个(ord(数据[0])!=0)的循环完成了,谢谢@feat.martin,使用python中的新服务尝试它,使客户端工作起来非常有魅力,因此我继续调整服务器(仍然可以找到我将这些0发送到哪里的想法…),感谢您花时间尝试和帮助,您是对的。@Aleksi Torhamo:print repr()给了我一个满是\x00的屏幕,我将对此进行调查,看看我是否能更好地理解我的服务器哪里出了问题。