В клиенте вы отправляете только имя файла, а не содержимое файла.Вам нужно прочитать из файла и отправить его на сокет.Вам также нужен способ отделить имя файла от остальных данных;Вы можете использовать символ новой строки в качестве разделителя (это означает, что вы не сможете отправить файл, имя которого включает символ новой строки, но его достаточно для простого игрушечного протокола).
При чтении из файла или сокета,Вы должны присвоить результат переменной, а не помещать переменную в список аргументов read()
или recv()
.
import socket
import sys
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s
s.connect((sys.argv[1], int(sys.argv[2])))
s.send(sys.argv[3] + "\n")
with open(sys.argv[3], "r") as f
data = f.read()
s.send(data)
print 'uploaded!'
. На сервере вам нужно прочитать только одну строку, чтобы получитьимя файлаСокеты не предоставляют метод readline()
, но есть метод makefile()
, который создает файловый объект, который использует сокет в качестве основного источника данных.
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s
port = 12345
s.bind (('',port))
s.listen(5)
print "Listening..."
while True:
c, addr = s.accept()
cfile = c.makefile()
print 'Connection from ', addr
file_name = cfile.readline().strip()
print "File name: ", file_name
with open(file_name, "w") as f
while True:
data = cfile.read()
if not data:
break
f.write(data)
print "File created!"
close c