Ik probeer een programma te schrijven voor bestandsoverdracht met behulp van sockets. Het serveruiteinde van de code werkt prima. Aan de clientzijde krijg ik echter de volgende foutmelding
Traceback (most recent call last):
File "client.py", line 54, in <module>
uploadFiles(directory)
File "client.py", line 36, in uploadFiles
transferFile(fname)
File "client.py", line 13, in transferFile
cs.connect((HOST, 36258))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
Mijn code is als volgt
import os
import socket
def transferFile(fname):
HOST = '127.0.0.1'
CPORT = 36258
MPORT = 36250
FILE = fname
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect((HOST, 36258))
cs.send("SEND " + FILE)
cs.close()
ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ms.connect((HOST, MPORT))
f = open(FILE, "rb")
data = f.read()
f.close()
ms.send(data)
ms.close()
def uploadFiles(directory):
home = os.getenv("HOME")
folder = str(home + "/" + directory)
os.chdir(folder)
dirList = os.listdir(folder)
print dirList
for fname in dirList:
if fname.endswith('.bin'):
transferFile(fname)
os.chdir(os.getenv("HOME"))
directory = "testdownload"
if not os.path.exists(directory):
os.makedirs(directory)
os.chdir(directory)
uploadFiles(directory)
Ik heb geprobeerd hulp te zoeken op Google en andere berichten op Stack Overflow, maar geen van alle hielp. Kan iemand me alsjeblieft helpen?
De regelnummers kunnen verschillen, omdat ik slechts een deel van de code heb geplakt
Antwoord 1, autoriteit 100%
Het probleem was duidelijk (zoals je doorhad) dat poort 36250 niet open was aan de serverkant op het moment dat je verbinding probeerde te maken (vandaar dat de verbinding werd geweigerd). Ik kan zien dat de server deze socket moest openen na ontvangst van de opdracht send
op een andere verbinding, maar blijkbaar “opende [it] niet synchroon met de clientzijde”.
Nou, de belangrijkste reden zou zijn dat er helemaal geen synchronisatie was. Bellen:
cs.send("SEND " + FILE)
cs.close()
zou de gegevens gewoon in een OS-buffer plaatsen; close
zou waarschijnlijk de gegevens wegspoelen en het netwerk binnendringen, maar het zou vrijwel zeker terugkeren voordat de gegevens de server zouden bereiken. Het toevoegen van sleep
na close
zou het probleem kunnen verhelpen, maar dit is geen synchronisatie.
De juiste oplossing zou zijn om ervoor te zorgendat de server de verbinding heeft geopend. Hiervoor moet de server u een bericht terugsturen (bijvoorbeeld OK
, of beter PORT 36250
om aan te geven waar u verbinding moet maken). Dit zou ervoor zorgen dat de server al luistert.
Het andere is je moet de retourwaarden van send
controleren om er zeker van te zijn hoeveel bytes er uit je buffer zijn gehaald. Of gebruik sendall
.
(Sorry voor het verontrusten met dit late antwoord, maar ik vond dit een vraag met veel verkeer en ik vond het slaapidee in het opmerkingengedeelte niet echt leuk.)