首页 > 解决方案 > python错误“TypeError:函数只需要1个参数(给定0)

问题描述

出现类型错误。我想制作一个工作代码,以便我可以提交它

我正在编写代码:客户端上传文件->服务器获取文件并保存在服务器上。

客户端是kali-linux,服务器是seed-ubuntu

  1. 客户端回显“待上传”> file.txt cat file.txt

  2. 服务器 python server.py

  3. 客户端python client.py(服务器的ip地址)file.txt

然后,在服务器

来自 ~~~~ 文件名的连接:file.txt 文件已创建。文件.txt

应该出现,

在此之后,在服务器上,当我键入 cat file.txt 时,我应该会看到 file_context。

但我只看到错误。

这是服务器代码

服务器.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

这是客户端代码。

客户端.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!'

标签: pythonlinuxsockets

解决方案


在客户端中,您只发送文件名,而不是文件内容。您需要从文件中读取并将其发送到套接字上。您还需要一种将文件名与其余数据分隔的方法;您可以使用换行符作为分隔符(这意味着您将无法发送名称包含换行符的文件,但对于简单的玩具协议来说已经足够了)。

从文件或套接字读取时,您必须将结果分配给变量,而不是将变量放入read()or的参数列表中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

推荐阅读