我尝试使用套接字进行2次发送。第一个成功,下一个不成功。 来自http://docs.python.org/howto/sockets.html 看来应该允许多次发送。无论好坏,我真的不需要从套接字读取。 我已经使用过twisted,但是就目前而言,我想坚持使用socket,如果我可以帮助它(部分是因为我在已经使用twisted进行通信的应用程序中使用它...这是一个单独的连接)。< / p>
“当连接完成时,套接字可用于发送对页面文本的请求。同一个套接字将读取回复,然后被销毁。这是正确的,被破坏。客户端套接字通常只是用于一次交换(或一小组连续交换)。“
成功发送的返回值= 35 FAILS = 32
的发送返回值代码进行一些小编辑以删除任何业务逻辑。
self._commandSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
def sendPrereqs(self,id,prereqs):
self._commandSock.connect(self._commandConnection)
#parse prereqs
temp = prereqs.split(',')
for pair in temp:
tup = pair.partition(':')
try:
command = 'some command'
logging.info('sending command: ' + command)
ret = self._commandSock.send(command)
if ret == None:
logging.info('send called successfully: ' + command)
else:
logging.info('socket returned non-None: ' + str(ret))
except:
print 'Unexpected Exception ', sys.exc_info()[0]()
print sys.exc_info()
#logging.info('Unexpected Exception '+ str(sys.exc_info()[0]()))
#logging.info(' ' + str(sys.exc_info()))
self._commandSock.close()`
答案 0 :(得分:2)
成功发送的返回值= 35 FAILS = 32
发送的返回值文档说成功的发送应该返回None。
不,不。 Documentation说:
返回发送的字节数。应用程序负责检查是否已发送所有数据;如果仅传输了一些数据,则应用程序需要尝试传递剩余数据。有关此概念的更多信息,请参阅Socket Programming HOWTO。
你还没有解释“FAILS”的意思。 send
调用成功返回,几乎可以肯定将32个字节放入套接字写缓冲区。
如果你认为它失败的唯一原因是它返回正确的值,那么答案显然是它没有失败。
如果出现其他问题,那么在更高层次上可能存在各种错误。一个可能是这样的:服务器(特别是如果它由不熟悉套接字的人编码)被编码为期望35个字节中的一个recv()
和32个字节中的一个recv()
。但它实际上得到67个字节的单个recv()
,并且永远等待第二个,永远不会到来。没有规则保证流(TCP)套接字上的每个send()
对应于另一侧的一个recv()
。您需要创建某种流协议来划分不同的消息。
与此同时,您所指的引用无关紧要。它描述了简单的Web浏览器如何使用客户端套接字:它们建立连接,发送一个,接收所有数据,然后破坏连接。我可以看出为什么它误导了你,你可能想提交一个文档错误来改进它。但就目前而言,请忽略它。
如果您想确保客户端正在发送正确的数据,并且问题出在服务器中,有两种简单的方法可以做到:
答案 1 :(得分:0)