2012-02-21 132 views
3

我一直在努力实现一个小型服务器 - 客户端应用程序,但跑了一个errrr:Python的 - 通过套接字发送文件

socket.error: [Errno 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

服务器:

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') 
+1

我注意到python的一个问题是你的无限循环的继承。 – dennmat 2012-02-21 21:45:35

+0

蝙蝠究竟是什么? – 2012-02-21 21:49:13

+1

这是一个无法解释的错字。 – dennmat 2012-02-21 21:50:17

回答

7

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

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'结尾,并让服务器搜索该字节。

+0

我试着将接受的连接添加到其他两个函数,但我不能使用recv()。你能否更好地解释一下,或者给我一个例子。 – 2012-02-22 09:49:11

+1

如果您希望我们帮助您解决问题,您应详细说明为什么*无法使用'recv' *。你是否遇到异常?如果是,哪一个?添加了如何从套接字读取的示例。 – phihag 2012-02-22 10:56:40

+0

它返回add:data = add.recv(4096) AttributeError:'元组'对象没有属性'recv' – 2012-02-22 11:01:36