Sending a file over TCP sockets in Python

后端 未结 6 1210
太阳男子
太阳男子 2020-12-02 08:14

I\'ve successfully been able to copy the file contents (image) to a new file. However when I try the same thing over TCP sockets I\'m facing issues. The server loop is not e

相关标签:
6条回答
  • 2020-12-02 08:53

    you may change your loop condition according to following code, when length of l is smaller than buffer size it means that it reached end of file

    while (True):
        print "Receiving..."
        l = c.recv(1024)        
        f.write(l)
        if len(l) < 1024:
            break
    
    0 讨论(0)
  • 2020-12-02 08:55

    Put file inside while True like so

    while True:
         f = open('torecv.png','wb')
         c, addr = s.accept()     # Establish connection with client.
         print 'Got connection from', addr
         print "Receiving..."
         l = c.recv(1024)
         while (l):
             print "Receiving..."
             f.write(l)
             l = c.recv(1024)
         f.close()
         print "Done Receiving"
         c.send('Thank you for connecting')
         c.close()   
    
    0 讨论(0)
  • 2020-12-02 08:57

    You can send some flag to stop while loop in server

    for example

    Server side:

    import socket
    s = socket.socket()
    s.bind(("localhost", 5000))
    s.listen(1)
    c,a = s.accept()
    filetodown = open("img.png", "wb")
    while True:
       print("Receiving....")
       data = c.recv(1024)
       if data == b"DONE":
               print("Done Receiving.")
               break
       filetodown.write(data)
    filetodown.close()
    c.send("Thank you for connecting.")
    c.shutdown(2)
    c.close()
    s.close()
    #Done :)
    

    Client side:

    import socket
    s = socket.socket()
    s.connect(("localhost", 5000))
    filetosend = open("img.png", "rb")
    data = filetosend.read(1024)
    while data:
        print("Sending...")
        s.send(data)
        data = filetosend.read(1024)
    filetosend.close()
    s.send(b"DONE")
    print("Done Sending.")
    print(s.recv(1024))
    s.shutdown(2)
    s.close()
    #Done :)
    
    0 讨论(0)
  • 2020-12-02 09:01

    The problem is extra 13 byte which server.py receives at the start. To resolve that write "l = c.recv(1024)" twice before the while loop as below.

    print "Receiving..."
    l = c.recv(1024) #this receives 13 bytes which is corrupting the data
    l = c.recv(1024) # Now actual data starts receiving
    while (l):
    

    This resolves the issue, tried with different format and sizes of files. If anyone knows what this starting 13 bytes refers to, please reply.

    0 讨论(0)
  • 2020-12-02 09:10

    Client need to notify that it finished sending, using socket.shutdown (not socket.close which close both reading/writing part of the socket):

    ...
    print "Done Sending"
    s.shutdown(socket.SHUT_WR)
    print s.recv(1024)
    s.close()
    

    UPDATE

    Client sends Hello server! to the server; which is written to the file in the server side.

    s.send("Hello server!")
    

    Remove above line to avoid it.

    0 讨论(0)
  • 2020-12-02 09:14

    Remove below code

    s.send("Hello server!")
    

    because your sending s.send("Hello server!") to server, so your output file is somewhat more in size.

    0 讨论(0)
提交回复
热议问题