【发布时间】:2011-10-19 20:36:52
【问题描述】:
我正在尝试为我的命令行服务器创建一个 gui 客户端。但是,我遇到了一些我似乎无法解决的恼人问题。
我不能 100% 确定实际的问题是什么,因为有时代码会起作用,有时则不会。我认为主要问题是最初我尝试了
while 1:
self.data = s.recv(1024)
if not self.data():
break
else:
print self.data()
然后我用这个发送给它
for f in files:
s.send(f)
每个 f 都是一个文件名字符串。我希望它会出现在 recv 方面,因为每个 recv 调用都会收到一个文件名,但是在一次 recv 调用中,我得到了一大块文件名,我假设 1024 个字符价值
这使得无法检查数据的结尾,因此循环从未退出。
这是我现在的代码
def get_data(self,size = 1024):
self.alldata = ""
while 1:
while gtk.events_pending():
gtk.main_iteration()
self.recvdata = self.s.recv(size)
self.alldata += self.recvdata
if self.alldata.find("\r\n\r\nEOF"):
print "recieved end message"
self.rdata = self.alldata[:self.alldata.find("\r\n\r\nEOF")]
break
print "All data Recieved: " + str(len(self.rdata)) + "Bytes"
print "All data :\n" + self.rdata + "\n-------------------------------------------------"
self.infiles = self.rdata.split("-EOS-")
for nf in self.infiles:
if len(nf) > 2:
self.add_message(self.incomingIcon,nf)
此刻我试图让客户端从服务器正确读取。我想要发生的是当输入命令列表并将其发送到客户端时,服务器会发回数据并将每个文件附加到列表存储中
有时这可以正常工作,有时仅返回 1200 个文件中的一个,如果它执行正常,如果我尝试键入另一个命令并发送它,整个 gtk 窗口就会消失并且程序变得无响应。
对不起,我无法更好地解释这个问题,我尝试了很多不同的解决方案,所有这些都给出了不同的错误。
如果有人可以解释 recv 命令以及为什么它可能会给出错误,这就是我向客户端发送数据的方式
if(commands[0] == 'list'):
whatpacketshouldlooklike=""
print "[Request] List files ", address
fil = list_files(path)
for f in fil:
sdata = f
whatpacketshouldlooklike += sdata + "-EOS-"
newSock.send(sdata +"-EOS-")
#print "sent: " + sdata
newSock.send("\r\n\r\nEOF")
whatpacketshouldlooklike += "\r\n\r\nEOF"
print "---------------------------------"
print whatpacketshouldlooklike
print "---------------------------------"
【问题讨论】:
-
您的原始帖子中有错字吗?
self.data = s.recv(1024)会使下一行self.data()看起来是个坏主意。套接字上的recv方法不返回可调用对象,afaik。 -
stonemetal 的回答是正确的。如果你对一个套接字进行两次
send()调用,每个调用都有一个 20 字节的字符串(例如文件名),recv()ing 端可能会在单个recv()中获得 40 个字节,或者它可能会在一个上获得 39 个字节recv()和下一个字节,或者可能必须调用 40 次,每次传递一个字节。您可以保证的是,它最终会非常努力地交付,并且永远不会交付任何乱序的东西。