#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-сервер, который позволяет нескольким клиентам подключаться к этому серверу одновременно, поэтому простой сервер для меня немного бесполезен, но я попробую изучить предоставленную вами ссылку