Python 套接字 Recv 无法正常工作有人可以解释

标签 python sockets

我正在尝试为我的命令行服务器创建一个图形用户界面客户端。但是,我遇到了一些我似乎无法解决的恼人问题。

我不是 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 "---------------------------------"

最佳答案

您在第一部分遇到的问题是套接字是基于流而不是基于消息的。您需要想出一个消息抽象以在流之上分层。这样,管道的另一端就知道发生了什么(作为一个命令的一部分预期有多少数据),而不是猜测应该发生什么。

关于Python 套接字 Recv 无法正常工作有人可以解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827807/

相关文章:

python - 一次将多个视频拆分为较短的视频

python - 使用 __setitem__ 还需要在 python 2 中实现 __len__

c - 套接字编程-setsockopt : Protocol not available?

c - 如何在套接字服务器应用程序中重用端口?

python - 用于创建完全定制的 UI 的 GUI 工具包?如果我想要完全非操作系统 native 外观,您会建议使用哪个工具包?

python - python : Noob IndexError

python - 使用节点行和列位置的字典将 Pandas 边列表转换为稀疏转换矩阵?

java - 套接字服务器的可行性

c socket prog - select() 问题

sql-server - Windows 2003 中 JDBC 连接可用的套接字数