【问题标题】:Python - Sending files over socketsPython - 通过套接字发送文件
【发布时间】:2012-02-21 21:33:59
【问题描述】:

我一直在尝试实现一个小型 SERVER - CLIENT 应用程序,但遇到了错误:

socket.error: [Errno 10057] 发送或接收数据的请求是 不允许,因为套接字未连接并且(在发送时 使用 sendto 调用的数据报套接字)没有提供地址

服务器:

class Server:
    gate = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 0
    file = ''

    def __init__(self, port):
        self.port = port
        self.gate.bind((self.host, self.port))  
        self.listen()

    def listen(self):
        self.gate.listen(10)
        while True:
            add = self.gate.accept()
            self.reciveFileName()
            self.reciveFile()


    def reciveFileName(self):
        while True:
            data = self.gate.recv(1024)
            self.file = data

    def reciveFile(self):
        createFile = open("new_"+self.file, "wb")
        while True:
            data = self.gate.recv(1024)
            createFile.write(data)
        createFile.close()



a = Server(1111)

客户:

class Client:
    gateway = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #host = socket.gethostname()
    host = ''
    port = 0
    file = ''

    def __init__(self, host, port, file):
        self.port = port
        self.host = host
        self.file = file
        self.connect()

    def connect(self):
        self.gateway.connect((self.host, self.port))
        self.sendFileName()
        self.sendFile()

    def sendFileName(self):
        self.gateway.send("name:" + self.file)

    def sendFile(self):
        readByte = open(self.file, "rb")
        data = readByte.read()
        readByte.close()

        self.gateway.send(data)
        self.gateway.close()



a = Client('93.103.56.251', 1111, 'data.txt')

【问题讨论】:

  • 我注意到 python 的一个问题是你连续的无限循环。
  • 附注,如果你喜欢套接字编程,你应该看看《Python 网络编程基础》这本书。它很好地解决了您的问题

标签: python sockets networking


【解决方案1】:

服务器有一个用于accept 传入连接的服务器套接字,以及用于每个这些连接的另一个套接字。从您的代码:

self.gate.listen(10)
while True:
    add = self.gate.accept()
    self.reciveFileName() # which calls self.gate.recv()

不要对reciveFilenamereciveFile中的self.gate进行操作(顺便说一句,正确的拼写是receive),你应该让这些方法对accepted连接进行操作,像这样:

def listen(self):
    self.gate.listen(10)
    while True:
        conn,address = self.gate.accept()
        self.receiveFilename(conn)

def receiveFilename(self, sock):
    buf = sock.recv(1024)
    print('First bytes I got: ' + buf)

另外,reciveFilename 目前一直在套接字上侦听。相反,您必须设计一个适当的协议来指定文件名何时结束以及文件内容何时开始。例如,您可以让文件名以b'\0' 结尾,并让服务器搜索该字节。

【讨论】:

  • 我尝试将接受的连接添加到其他两个函数,但我无法在其上使用 recv()。你能否更好地解释一下或给我一个例子。
  • 如果您希望我们帮助您解决问题,您应该详细说明为什么您不能在上面使用recv。你有例外吗?如果是,是哪一个?添加了如何从套接字读取的示例。
  • 它返回 add : data = add.recv(4096) AttributeError: 'tuple' object has no attribute 'recv'
  • Traceback(最近一次调用最后):文件“C:\Users\nered\Documents\Python\source\server\Server.py”,第 34 行,在 a = Server(1111 ) 文件“C:\Users\nered\Documents\Python\source\server\Server.py”,第 17 行,在 init self.listen() 文件“C:\Users\nered\Documents \Python\source\server\Server.py",第 23 行,在收听 self.receiveFile(conn) 文件中 "C:\Users\nered\Documents\Python\source\server\Server.py",第 28 行,在 receiveFile buf = sock.recv(4096) AttributeError: 'tuple' object has no attribute 'recv'
  • 当我遇到这个错误时,我是这样写的。
猜你喜欢
  • 2015-08-28
  • 2021-07-06
  • 1970-01-01
  • 2012-03-12
  • 2011-02-24
  • 2019-08-12
  • 2015-07-10
相关资源
最近更新 更多