Я создаю торрент как программу для проекта. Я хочу получить файл из нескольких источников, а затем объединить его. код ниже - мой сервер и клиент для передачи данных (обратите внимание: в основной программе эти коды являются потоками). такие переменные, как адрес, порт, каталоги, имя файла, numofclients и т. д., являются просто заполнителями. Проблема, с которой я сталкиваюсь, заключается в том, что половина времени, когда клиент подключается, сервер не регистрирует его (это означает, что он не дает информации о клиенте, чтобы продолжить процесс отправки). когда это происходит, клиентская сторона заявляет о своем подключении, но я не знаю, является ли эта проблема серверной или клиентской. Если кто-нибудь может помочь мне найти проблему, которая будет замечательной, я пытаюсь исправить ее в течение нескольких дней. Другая проблема заключается в том, что когда клиент действительно отправляет данные, он посылает их значительно медленнее, чем при использовании обычного базового цикла отправки с одним клиентом. является ли выбранным узким местом моя скорость? Примечание: я использую python 2.7. печать предназначена для мониторинга.многопользовательский сервер, который получает файл из нескольких источников
сервер:
import random
import select
import socket
portnum=3500
filename="Testvid.avi"
numofclients=2
datalist=[]
for i in range(0,numofclients):
datalist.append(open("C:/Users/Nitai/Desktop/Metorrent/"+filename+"-tmp"+str(i+1),'wb'))
server_socket = socket.socket()
server_socket.bind(('0.0.0.0', portnum))
server_socket.listen(5)
s, address = server_socket.accept()
open_client_sockets = []
print "receivefile initiated"
def send_waiting_messages (wlist):
for message in messages_to_send:
(client_socket, data) = message
if client_socket in wlist:
client_socket.send(data)
messages_to_send.remove(message)
messages_to_send = []
dataindex=0
socketindex=[]
finishedcount=0
while finishedcount<numofclients:
rlist, wlist, xlist = select.select([server_socket] + open_client_sockets, open_client_sockets, [])
for current_socket in rlist:
if current_socket is server_socket:
print "new client"
(new_socket,address)=server_socket.accept()
open_client_sockets.append(new_socket)
socketindex.append(new_socket)
print open_client_sockets
datatosend="IDP "+str(dataindex)+"%"+str(numofclients)
print datatosend
messages_to_send.append((new_socket,datatosend))
print "data sent"
print dataindex
dataindex+=1
else:
data=current_socket.recv(1024)
if data.find("EndPacket")!=-1:
print "connection finished"
finishedcount+=1
open_client_sockets.remove(current_socket)
else:
datalist[socketindex.index(current_socket)].write(data)
send_waiting_messages(wlist)
s.close()
print "select exited"
filewriter=open("C:/Users/Nitai/Desktop/Metorrent/"+filename+"-final",'wb')
for i in range(0,numofclients):
filewriter.write(datalist[i].read())
print "File received"
filewriter.close()
print "transfer finished"
клиента:
import random
import socket
import os
portnum=3500
filename="Testvid.avi"
address='10.0.0.5'
s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((address, portnum))
print "connected"
data=s.recv(1024)
print "data received"
print data
index=int(data[4:data.find("%")])
print index
numofclients=int(data[data.find("%")+1:len(data)])
print numofclients
filetosend=open("C:/Users/Nitai/Desktop/"+filename,'rb')
filelength=int(os.stat("C:/Users/Nitai/Desktop/"+filename).st_size)
startpoint=(filelength/numofclients)*index
if numofclients==index+1:
print "last part sender"
endpoint=filelength
else:
endpoint=(filelength/numofclients)*(index+1)
filetosend.seek(startpoint)
print startpoint
print endpoint
while startpoint+1024<endpoint:
a=filetosend.read(1024)
s.send(a)
startpoint+=1024
l=filetosend.read(endpoint-filetosend.tell())
s.send(l)
filetosend.close()
time.sleep(3)
endpacketdata="EndPacket"
s.send(endpacketdata)
print "File sent"
s.close()
print "data transfer complete"
спасибо за помощь!