Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从少数来源接收文件的多客户端服务器_Python_Sockets_Select_Networking_Torrent - Fatal编程技术网

Python 从少数来源接收文件的多客户端服务器

Python 从少数来源接收文件的多客户端服务器,python,sockets,select,networking,torrent,Python,Sockets,Select,Networking,Torrent,我正在为一个项目建立一个类似torrent的程序。我想从几个来源获取一个文件,然后将其合并在一起。下面的代码是用于数据传输的服务器和客户端(注意:在主程序中,这些代码是线程)。地址、端口、目录、文件名、numofclients等变量只是占位符。 我遇到的问题是,有一半的时间,当客户端连接时,服务器没有注册他(这意味着它没有提供继续发送过程所需的客户端信息)。当这种情况发生时,客户端声称其已连接,但我不知道此问题是基于服务器还是基于客户端。如果有人能帮我找到这个问题,我已经努力解决了好几天了。 另

我正在为一个项目建立一个类似torrent的程序。我想从几个来源获取一个文件,然后将其合并在一起。下面的代码是用于数据传输的服务器和客户端(注意:在主程序中,这些代码是线程)。地址、端口、目录、文件名、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"
随机导入
导入选择
导入套接字
portnum=3500
filename=“Testvid.avi”
numofclients=2
数据列表=[]
对于范围内的i(0,个客户端):
附加(打开(“C:/Users/Nitai/Desktop/Metorrent/”+filename+“-tmp”+str(i+1),“wb”))
服务器\u套接字=socket.socket()
server_socket.bind(('0.0.0.0',portnum))
服务器\u套接字。侦听(5)
s、 地址=服务器\套接字.接受()
打开\u客户端\u套接字=[]
打印“已启动接收文件”
def发送等待消息(wlist):
对于要发送的邮件中的邮件:
(客户端_套接字,数据)=消息
如果wlist中的客户端\u套接字:
客户端\u套接字发送(数据)
邮件发送到发送。删除(邮件)
消息发送=[]
数据索引=0
socketindex=[]
finishedcount=0

server\u socket.listen(5)
之后的
s,address=server\u socket.accept()
是不合适的,因为
accept
是在
while
循环中完成的。

server\u socket.listen(5)
之后的
s,address=server\u socket.accept()
这不合适,因为
接受
是在
while
循环中完成的

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"