как отправлять и получать файлы без закрытия сокета - PullRequest
0 голосов
/ 14 мая 2019

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

код моего клиента:

filename='48469.jpg'
TCP_IP = 'localhost'
TCP_PORT = 9001
BUFFER_SIZE = 1024

s = socket.socket()
s.connect((TCP_IP, TCP_PORT))
f = open(filename,'rb')
while True:
    l = f.read(BUFFER_SIZE)
    while (l):
        s.sendall(l)
        #print('Sent ',repr(l))
        l = f.read(BUFFER_SIZE)
    if not l:
        print ('file close()')
        s.close()
        #where I did closed the socket because
        #otherwise the server wont stop from receiving data
        f.close()
        break
print("1")


f = open('received_from_server.txt', 'wb')
print ('file opened')
while True:
    #print('receiving data...')
    data = s.recv(BUFFER_SIZE)
    if not data:
        f.close()
        print ('file close()')
        break
    # write data to a file
    f.write(data)
print("2")
print('Successfully get the file')
s.close()
print('connection closed')

код моего сервера:

filename='112.txt'
TCP_IP = 'localhost'
TCP_PORT = 9001
BUFFER_SIZE = 1024

class ClientThread(Thread):

    def __init__(self,ip,port,sock):
        Thread.__init__(self)
        self.ip = ip
        self.port = port
        self.sock = sock
        print ("New thread started for "+ip+":"+str(port))

    def run(self):
        f = open(filename,'rb')
        while True:
            l = f.read(BUFFER_SIZE)
            while (l):
                self.sock.send(l)
                #print('Sent ',repr(l))
                l = f.read(BUFFER_SIZE)
            if not l:
                f.close()
                self.sock.close()
                break

tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind((TCP_IP, TCP_PORT))
threads = []

while True:
    tcpsock.listen(5)
    print ("Waiting for incoming connections...")
    (conn, (ip,port)) = tcpsock.accept()
    print ('Got connection from ', (ip,port))
    f = open('received_from_client.jpg', 'wb')
    print ('file opened')
    while True:
        data =  conn.recv(BUFFER_SIZE)
        if not data:
            print("8")
            f.close()
            print ('file close()')
            break
        # write data to a file
        f.write(data)
    print("1")
    newthread = ClientThread(ip,port,conn)
    print("2")
    newthread.start()
    threads.append(newthread)

for t in threads:
    t.join()



В настоящее время отображается ошибка

была предпринята попытка выполнить операцию, не являющуюся сокетом "

...