Python 3: отправить файл и текст с помощью сокетов - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь использовать сокеты для отправки текста и файла с клиента на сервер. Проблема в том, что если я отправляю текст после отправки файла, отправка файла не работает (код блокируется, как будто сервер чего-то ждет).
Извините за длинный код, приведенный ниже, если вы запустите его так, как он работает, отправка клиентского файла test.txt на сервер; но если вы раскомментируете строки, отмеченные в коде (сервер отправляет «ok» и клиент получает), сценарий блокируется.
Спасибо за вашу помощь!

server.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket
import threading

listen_addr = '127.0.0.1'
listen_port = 8082

bindsocket = socket.socket()
bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
bindsocket.bind((listen_addr, listen_port))
bindsocket.listen(10)

class ClientThread(threading.Thread):

    def __init__(self, ip, port, clientsocket):

        threading.Thread.__init__(self)
        self.ip = ip
        self.port = port
        self.clientsocket = clientsocket
        print("[+] New thread %s %s" % (self.ip, self.port, ))

    def send_txt(self, data):
        self.clientsocket.send(data.encode())

        print("Text send:", data)
        return True

    def recv_txt(self):
        buf = self.clientsocket.recv(4096)
        data = buf.decode("utf-8")

        print("Received:", data)
        return data

    def recv_file(self, path_save):
        f = open(path_save, 'wb') #open in binary
        l = self.clientsocket.recv(4096)
        while (l):
            f.write(l)
            l = self.clientsocket.recv(4096)
        f.close()

        print("File received:", path_save)
        return True

    def run(self): 

        self.recv_txt()
        self.send_txt("OK")

        file_name = self.recv_txt().split(":")[1]
        print("file_name:" + file_name)
        self.recv_file("./" + file_name)
#        self.send_txt("OK") # **Uncomment and file sending fails**

        self.clientsocket.shutdown(socket.SHUT_RDWR)
        self.clientsocket.close()
        print("Client disconnected...")

while True:
    print("========================================")
    print("Waiting for client")

    clientsocket, (ip, port) = bindsocket.accept()

    newthread = ClientThread(ip, port, clientsocket)
    newthread.start()

client.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket
import datetime

host_addr = '127.0.0.1'
host_port = 8082

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect((host_addr, host_port))

def send_txt(data):
    conn.send(data.encode())

    print("Text send:", data)
    return True

def recv_txt():
    buf = conn.recv(4096)
    data = buf.decode("utf-8")

    print("Received:", data)
    return data

def send_file(path_file):
    f = open (path_file, "rb")
    l = f.read(4096)
    while (l):
        conn.send(l)
        l = f.read(4096)
    f.close()

    print("File sent:", path_file)
    return True

send_txt("Hello, world! - " + str(datetime.datetime.now()))
recv_txt()

send_txt("File_name:test.txt")
send_file("./test.txt")

#recv_txt() # **Uncomment and file sending fails**

print("Closing connection")
conn.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...