пустой файл после отправки его на tcp-сервер в python

#python #tcp

#python #tcp

Вопрос:

Я новичок в Python и пытаюсь создать многопоточный tcp-сервер и клиент, чтобы иметь возможность отправлять файлы между ними. Я написал несколько простых кодов для этих двух программ, но каждый раз, когда я получаю пустой файл на сайте сервера. Файл создается в папке, но когда я открываю его, внутри он пустой. Я также пытался отправить файлы .png, но Windows photoviewer не открывает их, говоря, что они пусты. Я не нашел никого, кто поддерживал бы такую проблему, поэтому я спрашиваю

Client.py

 import socket  # Import socket module

HOST = "localhost"  # Host address / name
PORT = 2137  # Reserves port for the service

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client.connect((HOST, PORT))

fileToSend = open('test.txt', 'rb') 
print "File ready to be sent" 
l = fileToSend.read(1024)

while l:
    print "Sending the file"
    client.send(l)
    l = fileToSend.read(1024)

fileToSend.close() print "done" 
client.close()
  

Server.py

 import socket
from threading import Thread
from SocketServer import ThreadingMixIn

import sys

TCPHOST = "localhost"
TCPPORT = 2137
BUFFER_SIZE = 20


class ClientThread(Thread):
    def __init__(self, HOST, PORT):
        Thread.__init__(self)
        self.HOST = HOST
        self.PORT = PORT
        print "New thread started for "   HOST   " on port "   str(PORT)

    def run(self):
        f = open('received.py', 'wb')
        while True:

                try:

                    data = conn.recv(1024)

                except socket.error, e:
                    print "Error receiving data: %s" % e
                    sys.exit(1)

                while data:
                    print "Receiving"
                    f.write(data)
                    data = conn.recv(1024)
                f.close()


try:
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((TCPHOST, TCPPORT))
    print "Socket created"
except socket.error, err:
    print "Failed to create socket" % err


threads = []

while True:
    server.listen(4)
    print "Waiting for connections"
    (conn, (HOST, PORT)) = server.accept()
    thread = ClientThread(HOST, PORT)
    thread.start()
    threads.append(thread)

for t in threads:
    t.join()
  

Ответ №1:

Я не уверен, что вы на самом деле хотите сделать, потому что я вижу, что вы импортируете SocketServer, однако вы не используете все это.

Если вы пытаетесь запустить простой сервер сокетов, то класс ClientThread и все остальные сведения о потоках в этом файле не нужны.

Следующий код в server.py выполнит задание

 import socket

import sys

TCPHOST = "localhost"
TCPPORT = 2137
BUFFER_SIZE = 20

try:
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((TCPHOST, TCPPORT))
    server.listen(4)
    print "Socket created"
except socket.error, err:
    print "Failed to create socket" % err

while True:
        print "Waiting for connections"
        (conn, (TCPHOST, TCPPORT)) = server.accept()
        try:

            while True:
                data = conn.recv(1024)
                f = open('received.py', 'wb')
                if data:
                   print "Receiving "   data
                   f.write(data)
                else:
                   f.close()
                   break;


        except socket.error, e:
            #pass
            print "Error receiving data: %s" % e
                #sys.exit(1)

        finally:
            conn.close()
  

Однако, если вы пытаетесь реализовать потоковый TCPServer с использованием ThreadingMixIn, вам нужно создать класс, который подклассирует SocketServer, и переопределить его функцию handle()

Документация по Python весьма полезна в этомhttps://docs.python.org/3.5/library/socketserver.html

(ThreadingMixIn находится внизу страницы)

Комментарии:

1. Я пытаюсь создать tcp-сервер, который позволяет нескольким клиентам подключаться к этому серверу одновременно, поэтому простой сервер для меня немного бесполезен, но я попробую изучить предоставленную вами ссылку