Я пытаюсь отправить файл через сокет tcp в одноранговой системе чата, закодированной в python. Получающий сокет, похоже, не знает, что больше нет файлов для получения. Единственный способ заставить получающий сокет не предвидеть данные, которые не идут, - это закрыть сокет отправки (используя socket.shutdown (socket.SHUT_WR)). Однако закрытие отправляющего сокета не является вариантом, потому что мне нужен этот сокет для отправки других сообщений. Я попытался выделить новый порт для отправки/получения файла и не удалось. Теперь я попытался создать конец файла «сигнал», но он не распознается на принимающей стороне как сообщение отдельно от сегмента tcp, поэтому я застрял.Как отправить конец файла без закрытия tcp-сокета
Передающий код выглядит следующим образом:
def sendFile(self,filePath):
try:
f = open(filePath, 'rb')
print 'file opened'
for soc in self.allClients.keys():
try:
f = open(filePath, 'rb')
except:
print "File does not exist"
print 'Sending File: ' + filePath
l = f.read(1024)
while (l):
print 'Sending...'
soc.send(l)
l = f.read(1024)
soc.send('end')
f.close()
print 'File sent'
except:
print "File does not exist"
принимающий код выглядит следующим образом:
def receiveFile(self, ext, clientsoc):
f = open('receivedFile' + ext,'wb')
print "Receiving File..."
l = clientsoc.recv(1024)
while(l):
print "Receiving..."
if (l is not 'end'):
f.write(l)
print l + '\n'
l = clientsoc.recv(1024)
else:
break
f.close()
print "Received Fileeeeeooooo"
Еще более странно, этот код работает, когда я использую его вне моей экспертной программы. Любая помощь будет очень признательна, я боролся с этим в течение двух дней.
Более типичный подход к этой проблеме - отправить длину файла * до *, когда вы начинаете отправлять файл. Таким образом, не стоит беспокоиться о том, если файл, который вы отправляете, содержит ваш конец файла. – FatalError