本文实例为大家分享了python3实现CS架构文件传输的具体代码,供大家参考,具体内容如下
1、目标:
基于tcp实现CS架构的文件传输
指令列表:(1)get:从服务器端下载文件
(2)put:向服务器端上传文件
(3)list:获得服务器端的目录
2、socket模块函数:
(1)send和sendall:send的作用是发送TCP数据,返回发送的数据大小。send函数不保证将所有数据全部发送,因此可能需要重复多次才能完成所有数据的发送。sendall的作用是发送完整的TCP数据,成功时返回None,失败时抛出异常
(2)bind:在服务器端使用,用于将socket绑定在一个特定的ip地址和端口上。在《UNIX网络编程》一书中提到,如果调用connect或者listen之前没有bind一个特定的端口,内核会为相应的套接字分配一个随机的端口。因此,在客户端调用connect函数之前不需要bind
(3)listen:通过参数设定服务器端最多可以接受几个客户端的连接,但是只有在完成与第一个客户端的传送后才会进行与第二个客户端的传送
3、代码:
(1)服务器端:
import socket import os import sys import time Host = '127.0.0.1' Port = 12000 Addr = (Host, Port) sockListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sockListener.bind(Addr) sockListener.listen(5) def recvfile(cliSocket): print('start reveiving file...') msg = 'no problem' msg_utf8 = msg.encode(encoding="utf-8") cliSocket.send(msg_utf8) filename_utf8 = clientSocket.recv(4096) filename = filename_utf8.decode() f = open(filename, 'wb') while True: data_utf8 = cliSocket.recv(4096) data = data_utf8.decode() if data=='EOF': print('received file successfully') break f.write(data_utf8) f.close() def sendfile(cliSocket): print('start sending file...') msg = 'no problem' msg_utf8 = msg.encode(encoding="utf-8") cliSocket.send(msg_utf8) filename_utf8 = cliSocket.recv(4096) filename = filename_utf8.decode() f = open(filename, 'rb') while True: data = f.read(4096) if not data: break cliSocket.sendall(data) f.close() time.sleep(1) msg = 'EOF' msg_utf8 = msg.encode(encoding="utf-8") cliSocket.sendall(msg_utf8) print('sent file successfully') def getList(cliSocket): path = sys.path[0] every_file = os.listdir(path) for filename in every_file: pathmsg = filename + '\n' pathmsg_utf8 = pathmsg.encode(encoding="utf-8") cliSocket.sendall(pathmsg_utf8) time.sleep(1) msg = 'EOF' msg_utf8 = msg.encode(encoding="utf-8") cliSocket.sendall(msg_utf8) print('all filenames have been send') while True: print('waiting for connection...') clientSocket, addr = sockListener.accept() print('... connection from:', addr) while True: msg_utf8 = clientSocket.recv(4096) msg = msg_utf8.decode() if msg=='exit': print(addr, 'close the connection') break elif msg=='get': sendfile(clientSocket) elif msg=='put': recvfile(clientSocket) elif msg=='list': getList(clientSocket) else: print('client error!') break
(2)客户端:
import socket import time Host = '127.0.0.1' Port = 12000 Addr = (Host, Port) clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientSocket.connect(Addr) def recvfile(filename): print('start receiving file...') f = open(filename, 'wb') filename_utf8 = filename.encode(encoding="utf-8") clientSocket.sendall(filename_utf8) while True: data_utf8 = clientSocket.recv(4096) data=data_utf8.decode() if data=='EOF': print('receive file successfully') break f.write(data_utf8) f.close() def sendfile(filename): print('start sending file...') f = open(filename, 'rb') filename_utf8 = filename.encode(encoding="utf-8") clientSocket.sendall(filename_utf8) while True: data = f.read(4096) if not data: break clientSocket.sendall(data) f.close() time.sleep(1) endmsg = 'EOF' endmsg_utf8 = endmsg.encode(encoding="utf-8") clientSocket.sendall(endmsg_utf8) print('send file successfully') def confirm(confirm_command): confirm_command_utf8 = confirm_command.encode(encoding="utf-8") clientSocket.sendall(confirm_command_utf8) msg_utf8 = clientSocket.recv(4096) msg = msg_utf8.decode() print('reveive message:', msg) if msg=='no problem': return True else: return False def operation1(filename): if confirm('get'): recvfile(filename) else: print('serve error!') def operation2(filename): if confirm('put'): sendfile(filename) else: print('serve error!') def operation3(act): if act=='list': act_utf8 = act.encode(encoding="utf-8") clientSocket.sendall(act_utf8) while True: msg_utf8 = clientSocket.recv(1024) msg = msg_utf8.decode() if msg=='EOF': break print(msg) else: print('wrong command!') try: while True: command = input('>') if not command: continue elif command=='exit': command_utf8 = command.encode(encoding="utf-8") clientSocket.sendall(command_utf8) print('the connection is closed') break msg = command.split() if len(msg)==2 and msg[0]=='get': operation1(msg[1]) elif len(msg)==2 and msg[0]=='put': operation2(msg[1]) elif len(msg)==1: operation3(msg[0]) else: print('wrong command!') except socket.error as e: print('error:', e) print('an error causes the connection to close!') clientSocket.close()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 瑞鸣《喜马拉雅》[WAV+CUE]
- 【古典音乐】郑京和《华纳录音全集》11CD.2015[FLAC+CUE]
- 群星《经典再现·国语男声》2CD[DTS-WAV]
- 打完猴了!来聊聊你最喜欢哪段故事!
- 玩家分享《黑神话:悟空》大怨种:想痛快玩游戏花了快400块
- 作者回应《黑神话》墙绘被毁:当地相关部门支持重绘
- 李泉.1995-上海梦【魔岩】【WAV+CUE】
- 何雨雯.1994-给你的歌【天王唱片】【WAV+CUE】
- 群星.1994-神摇第一章·极乐扬州路【D.I.Y】【WAV+CUE】
- 《车烧友 发烧情歌天碟3CD》[WAV/分轨][1.9GB]
- 《薛之谦 情歌不变招牌 霸气情歌2CD》[WAV/分轨][1.2GB]
- 《刘若英 滚石SACD精选》[ISO][1GB]
- 仙境传说新启航牧师怎么加点 牧师属性技能加点推荐
- 仙境传说新启航舞娘怎么加点 舞娘属性技能加点推荐
- 魔兽世界祖尔格拉布在哪 魔兽世界祖尔格拉布位置介绍