Я пытаюсь создать клиент 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 "---------------------------------"