python 客户端-服务器中的多客户端文件传输,无需线程
Multiple clients file transfer in python client-server without threading
我正在尝试多个客户端通过一个端口同时向服务器发送文件(即服务器是 运行 个不同的端口,多个客户端连接到每个端口并发送文件)。我看过几个答案,例如 this,但他们使用不同的方法,我只想有人指出我在这里做错了什么,这样我就可以使用我理解得更好的相同代码。请帮助我:
- 为什么我的代码不能处理多文件传输?
- 我也在计算吞吐量(即实际文件传输),这是正确的方法吗?
感谢您的帮助。
----- server.py ---
import socket,time
import sys, optparse,datetime
#def client(net,src,dst):
#def server(net,src):
print("we are in server ...")
parser = optparse.OptionParser()
parser.add_option('-i',dest='ip',default='')
parser.add_option('-p',dest='port',type='int',default=5001)
parser.add_option('-t',dest='ftype',type='str',default='.txt')
(options,args) = parser.parse_args()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
host = socket.gethostname()
server_socket.bind((options.ip, options.port))
server_socket.listen(100)
s = datetime.datetime.now().strftime("%d%m%y_%H%M%S")
f = open('.recfile_%s_%s'%(s,options.port)+options.ftype,'wb')
count = 0
while 1:
client_socket, addr = server_socket.accept()
start_time = datetime.datetime.now()
cl_addr = addr[0]
print 'Got connection from', addr
print("Receiving ...")
data = client_socket.recv(1024)
while(data):
f.write(data)
data = client_socket.recv(1024)
count+=len(data)
continue
f.close()
client_socket.close()
end_time = datetime.datetime.now()
total_time = end_time - start_time
total_time = total_time.total_seconds()
average_speed = round((1024*count*0.001)/(total_time),3)
fd = open('server_data.csv','a+')
fd.write(str(cl_addr)+','+str(start_time)+','+str(end_time)+','+str(total_time)+','+str(average_speed)+','+str(options.port)+'\n\r')
fd.close()
server_socket.close()
客户端
----- client.py -----
import socket
import sys, optparse
#def client(net,src,dst):
print("we are in client ..")
parser = optparse.OptionParser()
parser.add_option('-i',dest='ip',default='')
parser.add_option('-p',dest='port',type='int',default=5001)
parser.add_option('-f',dest='fname',type='str',default='hugefile.txt')
(options,args) = parser.parse_args()
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((options.ip,options.port))
img_file = options.fname
f = open(img_file,'rb')
data = f.read(1024)
while(data):
client_socket.send(data)
data = f.read(1024)
f.close()
client_socket.shutdown(socket.SHUT_WR)
client_socket.close()
print "Data Sent successfully!"
至少存在一个问题:recfile 文件在开始循环之前打开,并在循环内关闭。这意味着从第二次迭代开始,您将尝试在一个关闭的文件上写入并得到一个异常。
如何避免:with open(...) as ...:
块很棒,因为它们不仅可以保证在出现错误时正确关闭,而且还可以确保程序中的块结构正确。
顺便说一句,count
也应该在循环内部重置为 0,越接近循环对代码的未来读者和维护者越好
我通过即兴创作 找到了解决方案。
如果没有 multiprocessing
或 multithreading
,则不可能有多个连接到同一个套接字。因为我使用 Python 2.7 multithreading
不适合我。
我正在尝试多个客户端通过一个端口同时向服务器发送文件(即服务器是 运行 个不同的端口,多个客户端连接到每个端口并发送文件)。我看过几个答案,例如 this,但他们使用不同的方法,我只想有人指出我在这里做错了什么,这样我就可以使用我理解得更好的相同代码。请帮助我:
- 为什么我的代码不能处理多文件传输?
- 我也在计算吞吐量(即实际文件传输),这是正确的方法吗?
感谢您的帮助。
----- server.py ---
import socket,time
import sys, optparse,datetime
#def client(net,src,dst):
#def server(net,src):
print("we are in server ...")
parser = optparse.OptionParser()
parser.add_option('-i',dest='ip',default='')
parser.add_option('-p',dest='port',type='int',default=5001)
parser.add_option('-t',dest='ftype',type='str',default='.txt')
(options,args) = parser.parse_args()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
host = socket.gethostname()
server_socket.bind((options.ip, options.port))
server_socket.listen(100)
s = datetime.datetime.now().strftime("%d%m%y_%H%M%S")
f = open('.recfile_%s_%s'%(s,options.port)+options.ftype,'wb')
count = 0
while 1:
client_socket, addr = server_socket.accept()
start_time = datetime.datetime.now()
cl_addr = addr[0]
print 'Got connection from', addr
print("Receiving ...")
data = client_socket.recv(1024)
while(data):
f.write(data)
data = client_socket.recv(1024)
count+=len(data)
continue
f.close()
client_socket.close()
end_time = datetime.datetime.now()
total_time = end_time - start_time
total_time = total_time.total_seconds()
average_speed = round((1024*count*0.001)/(total_time),3)
fd = open('server_data.csv','a+')
fd.write(str(cl_addr)+','+str(start_time)+','+str(end_time)+','+str(total_time)+','+str(average_speed)+','+str(options.port)+'\n\r')
fd.close()
server_socket.close()
客户端
----- client.py -----
import socket
import sys, optparse
#def client(net,src,dst):
print("we are in client ..")
parser = optparse.OptionParser()
parser.add_option('-i',dest='ip',default='')
parser.add_option('-p',dest='port',type='int',default=5001)
parser.add_option('-f',dest='fname',type='str',default='hugefile.txt')
(options,args) = parser.parse_args()
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((options.ip,options.port))
img_file = options.fname
f = open(img_file,'rb')
data = f.read(1024)
while(data):
client_socket.send(data)
data = f.read(1024)
f.close()
client_socket.shutdown(socket.SHUT_WR)
client_socket.close()
print "Data Sent successfully!"
至少存在一个问题:recfile 文件在开始循环之前打开,并在循环内关闭。这意味着从第二次迭代开始,您将尝试在一个关闭的文件上写入并得到一个异常。
如何避免:with open(...) as ...:
块很棒,因为它们不仅可以保证在出现错误时正确关闭,而且还可以确保程序中的块结构正确。
顺便说一句,count
也应该在循环内部重置为 0,越接近循环对代码的未来读者和维护者越好
我通过即兴创作 multiprocessing
或 multithreading
,则不可能有多个连接到同一个套接字。因为我使用 Python 2.7 multithreading
不适合我。