--------------------------------------------生活不止眼前的苟且,还有诗和远方的田野.

day 29 socketserver + ftp

# # ------------------------------------------------------------------------------------------------------------#. 
# # --------------[socketserver示例客户端]--------------
import socket
import time
client = socket.socket()
client.connect(('127.0.0.1',8001)) while 1:
client_data = input('别开车>>>')
client.send(client_data.encode('utf-8')) from_server_msg = client.recv(1024)
print(from_server_msg.decode('utf-8')) client.close()
# # --------------[socketserver示例服务端]--------------
import socketserver

class KnightServer(socketserver.BaseRequestHandler):

    def handle(self):
# self.request 相当于conn链接通道
while 1:
from_client_msg = self.request.recv(1024)
print(from_client_msg.decode('utf-8'))
server_msg = input('服务端说>>>')
self.request.send(server_msg.encode('utf-8')) if __name__ == '__main__':
ip_port = ('127.0.0.1',8001)
server = socketserver.ThreadingTCPServer(ip_port,KnightServer)
server.serve_forever()
# # --------------[ftp上传实例客户端]--------------
import socket
import json
import os
import struct
client = socket.socket() client.connect(('127.0.0.1',8001))
file_size = os.path.getsize(r'D:\python_workspace\day029\xxx.mp4')
#定义了一个文件描述信息,以字典的形式
file_info_dict = {
'file_path': r'D:\python_workspace\day029\xxx.mp4',
'file_name': 'xxx.mp4',
'file_size':file_size
} def login(): print('欢迎来到登录页面')
username = input('请输入用户名>')
password = input('请输入密码>')
#将用户名和密码拼接成一个字符串
user_info = username + '|' + password
client.send(user_info.encode('utf-8')) #如果服务端的状态码为200,登录成功,如果不是,登录失败,登录成功,这个信息就是服务端的功能信息
from_server_status = client.recv(1024).decode('utf-8')
if from_server_status == '201':
print('登录失败')
else:
all_file_size = 0
#接收的是一个json格式的字符串
server_func_list = json.loads(from_server_status)
#打印了功能信息
print(server_func_list) #{'1': '上传', '2': '下载'}
client_func_choice = input('请输入要选择的功能序号>>>')
#选择1,说明要上传
if client_func_choice == '1':
# 上传或者下载的功能序号添加到了文件描述信息的字典中
file_info_dict['func_choice'] = client_func_choice
file_dict_json = json.dumps(file_info_dict,ensure_ascii=False)
#发送文件描述信息
client.send(file_dict_json.encode('utf-8'))
#
with open(file_info_dict['file_path'],'rb') as f:
while all_file_size < file_info_dict['file_size']:
every_read_data = f.read(1024)
client.send(every_read_data)
every_read_datalen = len(every_read_data) all_file_size += every_read_datalen def register():
print('注册') print('-----请登录------')
print('1:登录\n2:注册') #选择登录
function_choice = input('请输入你要选择的功能序号>>>>')
#通过选择的序号,找到对应的函数执行,一个字典搞定
function_dict = {'1':login,'2':register} function_dict[function_choice]()
# # --------------[ftp上传实例服务端]--------------
import socket
import time
import json
server = socket.socket() server.bind(('127.0.0.1',8001))
server.listen() conn,addr = server.accept() def upload(conn,client_file_info):
#
upload_file_path = r'D:\jj' + '\\' + client_file_info['file_name']
recv_all_datalen = 0
with open(upload_file_path,'wb') as f:
while recv_all_datalen < client_file_info['file_size']:
every_recv_data = conn.recv(1024)
every_recv_datalen = len(every_recv_data)
recv_all_datalen += every_recv_datalen
f.write(every_recv_data) print('客户端上传文件') client_userinfo = conn.recv(1024).decode('utf-8')
#定义一个需要返回给服务端的功能列表
server_function_list = {'1':'上传','2':'下载'}
#将功能字典转换为json字符串,然后进行编码,转成bytes类型
json_func_list = json.dumps(server_function_list,ensure_ascii=False) #服务端登录认证
with open('userinformation','r',encoding='utf-8') as f:
for i in f:
if i.strip() == client_userinfo:
#登录成功以后,将服务端能够提供的功能,发送给客户端
conn.send(json_func_list.encode('utf-8'))
#接收客户端的文件描述信息,其中有一项是功能序号
client_fileinfo_json = conn.recv(1024).decode('utf-8')
client_file_info = json.loads(client_fileinfo_json) print(client_file_info)
if client_file_info['func_choice'] == '1':
upload(conn,client_file_info) break
else:
#登录错误的信息码
conn.send(b'201')

												

最新文章

  1. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
  2. 如何调试js文件
  3. php遇见的错误(一)
  4. java 类型转json格式
  5. HDU 1494 跑跑卡丁车
  6. Python对象体系揭秘
  7. MSSQLSERVER数据库- 获取月份的第一天和最后一天
  8. plsql中文乱码问题方案解决
  9. Azure AI 服务之文本翻译
  10. jsp页面的地址
  11. Redis集群概述
  12. 常用的移动前端webapp交互细节
  13. Html链接标签:
  14. loadrunner&#160;场景设计-设计与实践
  15. 【splunk】一些查询例子
  16. python urlopen
  17. vue 获取跳转上一页组件信息
  18. JAVA Spring 事物 ( 已转账为例 ) 基于 XML 配置,事务类型说明
  19. jquery attr和prop区别
  20. RHEL6 建立DVD repo

热门文章

  1. C#面向对象 类
  2. MSSQL coalesce系统函数简介
  3. ArcGIS Server10.2 集群部署注意事项
  4. hive笔记:时间格式的统一
  5. c/c++赋值函数(重载=号运算符)
  6. Cs231n课堂内容记录-Lecture 4-Part1 反向传播及神经网络
  7. 用惯图形界面的SVNer,如何突破Git----简单教程
  8. linux下安装jdk_mysql_tomcat_redis
  9. UVA1607-Gates(思维+二分)
  10. AppCan10个超实用的APP必备插件,让你少敲80%代码