2015-12-31 1 views
1

Je suis en train de créer un programme de type torrent pour un projet. Je veux obtenir un fichier de quelques sources et ensuite le fusionner ensemble. le code ci-dessous est mon serveur et client pour le transfert de données (note: dans le programme principal ces codes sont des threads). les variables telles que l'adresse, le port, les répertoires, le nom de fichier, numclclients etc. sont juste des espaces réservés. Le problème que j'ai est que la moitié du temps, quand un client se connecte, le serveur ne l'enregistre pas (ce qui signifie qu'il ne donne pas au client les informations dont il a besoin pour continuer le processus d'envoi). Lorsque cela se produit, le client réclame son connecté mais je ne sais pas si ce problème est basé sur le serveur ou sur le client. Si quelqu'un peut m'aider à trouver le problème, j'essaye de le régler depuis des jours. Un autre problème secondaire est que lorsque le client envoie les données, il l'envoie beaucoup plus lentement que lorsqu'il utilise une boucle d'envoi de base normale avec un client. est-ce que le bottleneck de sélection est ma vitesse? note: J'utilise python 2.7. Les impressions sont pour la surveillance.serveur multiclient qui reçoit un fichier de quelques sources

serveur:

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" 

client:

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" 

merci pour l'aide!

Répondre

0

Après la server_socket.listen(5), vous avez s, address = server_socket.accept() qui est hors de propos, puisque le accept doit être fait dans la boucle while.