使用Python标准库socket模块实现基于服务器,客户端的简单文件下载。
服务端代码
import os,sys,time,_thread,socket
blocksize = 1024
defaultdir = r'/Data/Datas'
defaulthost = ''
defaultport = 5555
def now():
return time.asctime()
def serverthread(clientsock):
sockfile = clientsock.makefile('r')
filename = sockfile.readline()[:-1]
try:
file = open(os.path.join(defaultdir,filename),'rb')
while True:
bytes = file.read(blocksize)
if not bytes:
break
send = clientsock.send(bytes)
assert send == len(bytes)
except:
print('Error downloading file on server : ',filename)
clientsock.close()
def server(host=defaulthost,port=defaultport):
serversock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serversock.bind((host,port))
serversock.listen(5)
while True:
clientsock,address = serversock.accept()
print('Server connected by ',address,'at',now())
_thread.start_new_thread(serverthread,(clientsock,))
if __name__ == '__main__':
server()
客户端代码
import os,sys,time,socket
blocksize = 1024
defaulthost = '10.10.12.101'
defaultport = 5555
def now():
return time.asctime()
def client(filename,host=defaulthost,port=defaultport):
downdir = r'F:/Data/Datas'
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((host,port))
sock.send((filename+'\n').encode())
filedir = os.path.join(downdir , filename)
print(filedir)
file = open(filedir,'wb')
while True:
data = sock.recv(blocksize)
file.write(data)
if not data:
break
sock.close()
file.close()
print('Client got ',filename,'at',now())
if __name__ == '__main__':
while True:
filename = input('请输入要下载的文件名=> ')
client(filename)