2015-12-31 7 views
1

Я создаю торрент как программу для проекта. Я хочу получить файл из нескольких источников, а затем объединить его. код ниже - мой сервер и клиент для передачи данных (обратите внимание: в основной программе эти коды являются потоками). такие переменные, как адрес, порт, каталоги, имя файла, 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" 

спасибо за помощь!

ответ

0

После server_socket.listen(5), у вас есть s, address = server_socket.accept(), которая неуместна, так как accept должно быть сделано в цикле while.