python客户端tcp套接字可以用于多次发送吗



我尝试使用套接字进行2次发送。第一个成功了,下一个没有成功。来自http://docs.python.org/howto/sockets.html看起来应该允许多次发送。不管是好是坏,我真的不需要从插座里读。我使用过twisted,但就目前而言,如果我能帮助的话,我想坚持使用插座(部分原因是我在已经使用twisted进行通信的应用程序中使用它……这是一个单独的连接)。

当连接完成时,套接字s可以用来发送对页面文本的请求。同一个套接字将读取回复,然后被销毁。没错,被销毁。客户端套接字通常只用于一个交换(或一小组顺序交换)。

发送成功的返回值=35发送失败的返回值=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()`

发送成功的返回值=35发送失败的返回值=32

文档显示,成功发送应返回None。

没有。文件显示:

返回发送的字节数应用程序负责检查所有数据是否已发送;如果只传输了部分数据,则应用程序需要尝试传递其余数据。有关此概念的更多信息,请参阅套接字编程HOWTO。

你还没有解释你所说的";失败";。send调用成功返回,并且几乎可以肯定它已将32个字节放入套接字写入缓冲区。

如果你认为它失败的唯一原因是它返回了正确的值,那么答案显然是它没有失败。

如果其他事情出了问题,那么在更高的层面上可能会出现各种各样的问题。一种可能的情况是:服务器(特别是如果它是由不太了解套接字的人编码的)被编码为期望一个35字节的recv()和一个32字节的recv()。但它实际上得到了一个67字节的recv(),并永远等待第二个,而第二个永远不会到来。没有规则保证流(TCP)套接字上的每个send()对应于另一侧的一个recv()。您需要创建某种流协议来划分单独的消息。

同时,你所指的那句话是无关紧要的。它描述了简单的web浏览器如何使用客户端套接字:它们建立连接,进行一次发送,接收所有数据,然后破坏连接。我明白它为什么误导了你,你可能想提交一个文档错误来改进它。但现在,忽略它。

如果你想绝对确保客户端发送正确的数据,而问题出在服务器上,有两种简单的方法可以做到:

  1. 使用netcat作为一个微不足道的替代服务器(例如,nc -kl 6000,用实际端口替换"6000"),并确保它记录您认为服务器应该看到的内容。

  2. 使用Wireshark监视客户端和服务器之间的连接。

一旦确认问题在服务器端,就需要调试服务器。如果你需要帮助,最好在一个新的问题中完成,在这个问题中,你可以发布服务器代码而不是客户端,并解释(在这里有一个链接)你确信客户端发送了正确的信息。

文档仅引用一个常见场景。只要套接字没有关闭,就可以随时调用所有套接字上的sendsendallsendto

请注意,这些方法返回发送的字节数,32和35只是意味着第一次发送32个字节,第二次发送35个字节。

事实上,socket.send返回时没有异常,这意味着数据被交给了操作系统,但并不是说它实际上到达了端点(或者已经被那里的应用程序正确读取)。

最新更新