ошибка Python "TypeError: функция принимает ровно 1 аргумент (задано 0) - PullRequest
0 голосов
/ 19 декабря 2018

TypeError появляется.я хочу сделать рабочий код, чтобы я мог отправить его

я делаю код: клиент загружает файл -> сервер получает файл и сохраняет на сервере.

клиент - это kali-linux, сервер это seed-ubuntu

STEP

  1. Клиентский эхо "для загрузки"> file.txt cat file.txt

  2. Сервер python server.py

  3. Клиентский python client.py (ip адрес сервера) file.txt

Затем, всервер

соединение из ~~~~ имя файла: файл file.txt создан.file.txt

должен появиться,

И после этого, на сервере, когда я набираю cat file.txt, я должен увидеть file_context.

, но я вижу только ошибку.

это код сервера

server.py

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 12345
s.bind (('',port))
s.listen(5)
print "Listening..."
while True:
    c, addr = s.accept()
    print 'Connection from ', addr

    file_name = c.recv(1024)
    print "File name: ", file_name

    f= open(file_name, "w")
    file_context = f.write()
    f.close()

    c.recv(1024)
    print "File created!"
    c.close

и это код клиента.

client.py

import socket
import sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], int(sys.argv[2])))
s.send(sys.argv[3])
data = s.send("")
f = open(sys.argv[3], "r")
f.read(data)
f.close()
s.close()
print 'uploaded!'

1 Ответ

0 голосов
/ 19 декабря 2018

В клиенте вы отправляете только имя файла, а не содержимое файла.Вам нужно прочитать из файла и отправить его на сокет.Вам также нужен способ отделить имя файла от остальных данных;Вы можете использовать символ новой строки в качестве разделителя (это означает, что вы не сможете отправить файл, имя которого включает символ новой строки, но его достаточно для простого игрушечного протокола).

При чтении из файла или сокета,Вы должны присвоить результат переменной, а не помещать переменную в список аргументов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...