day29 socketsever ftp功能简单讲解
今日所学
一.ftp上传简单实例
二.socketsever的固定用法
三.验证合法性连接
1.ftp上传实例
这个题目是我们现在网络编程比较基础一点的题目

下面我们只写简单上传的代码
上传服务端的代码
import socket
import struct
import json
sever=socket.socket()
ip_port=('127.0.0.1',8008)
sever.bind(ip_port)
sever.listen()
conn,addr=sever.accept()
#先接受4个字节,为文件的信息的长度
struct_len_info=conn.recv(4) # 拿到字典的长度,(拿到的结果为元组,从元组中把数据拿出来)
data_len=struct.unpack('i',struct_len_info)[0] # 然后根据拿到的长度,接收字典的字节类型
data_dict_bytes=conn.recv(data_len) # 将字节转换为json字符串类型
data_json=data_dict_bytes.decode('utf-8') # 将json字符串转换为字典
data_dict=json.loads(data_json) sum=0
#算出文件的路径
file_path='相对路径'+'\\'+data_dict['file_name']
with open(file_path,mode='wb') as f:
while sum<data_dict['file_size']: from_client_msg=conn.recv(1024) sum+=len(from_client_msg) f.write(from_client_msg)
上传客户端代码
import socket
import os
import struct
import json
client=socket.socket()
cleint.connect(('127.0.0.1',8008))
#读取文件的大小(读出来的内容是文件的字节类型)
file_size=os.path.getsize(r'相对路径')
# 在发送真实的文件之前,先将文件的信息包装成字典发送给服务端(文件名字,文件大小,文件路径)
file_info={
'file_name':'XXX.XXX',
'file_size' : file_size,
'file_LuJing': '文件的路径'
}
#将字典序列化成json字符串
file_info_str=json.dumps(file_info)
#将json字符串编码成字节
file_info_byte=file_info_str.encode('utf-8')
#求出字典的字节长度
info_len=len(file_info_byte)
# 打包
info_struct=struct.pack('i',info_len)
# 将打包好的信息和长度发送给服务端
client.send(info_struct+file_info_byte)
with open('你要发送的文件.xxx',mode='rb') as f:
#如果你累加的长度小于文件的长度,让他继续执行
while sum<file_size:
#每次读取的大小最大为1024
every_read=f.read(1024)
sum+=len(every_read)
#将读取到的数据发送给服务端
client.send(every_read)
注 : 上传和下载只是角色互换而已,上传为客户端向服务端中保存数据,而下载是客户端从服务端的内容中下载相应的文件.
2.socketsever的固定用法
话不多说,上代码
先上传服务端的代码
import socketsever
class 类名(socketsever.BaseRequestHandler):
# 注:这里的handle方法名是固定的,是不允许变的
def handle(self):
while 1:
# self.request相当于conn
from_client_msg=self.request.recv(1024)
print(from_client_msg.decode('utf-8'))
msg=input('服务端说:)
self.request.send(msg.encode('utf-8')) if __name__='__main__':
ip_port=('127.0.0.1',8008)
sever=socketsever.ThreadingTCPSever(ip_port,类名)
sever.serve_forever()
以下是客户端的代码
import socket
client=socket.socket()
client.connect(('127.0.0.1',8008))
while 1:
msg=input('客户端说>>>')
if msg=='byebye':
break
client.send(msg.encode('utf-8'))
from_sever_msg=client.recv(1024)
print(from_sever_msg.decode('utf-8')) client.close()
3. 验证合法性连接的服务端
服务端:
from socket import *
import hmac,os
#秘钥
secret_key=b'Jedan has a big key!'
def conn_auth(conn): print('开始验证新链接的合法性')
msg=os.urandom(32)#生成一个32字节的随机字符串
conn.sendall(msg)
h=hmac.new(secret_key,msg)
digest=h.digest()
respone=conn.recv(len(digest))
return hmac.compare_digest(respone,digest) def data_handler(conn,bufsize=1024):
if not conn_auth(conn):
print('该链接不合法,关闭')
conn.close()
return
print('链接合法,开始通信')
while True:
data=conn.recv(bufsize)
if not data:break
conn.sendall(data.upper()) def server_handler(ip_port,bufsize,backlog=5):
'''
只处理链接
:param ip_port:
:return:
'''
tcp_socket_server=socket(AF_INET,SOCK_STREAM)
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(backlog)
while True:
conn,addr=tcp_socket_server.accept()
print('新连接[%s:%s]' %(addr[0],addr[1]))
data_handler(conn,bufsize) if __name__ == '__main__':
ip_port=('127.0.0.1',9999)
# 自己定义接收大小
bufsize=1024
server_handler(ip_port,bufsize)
客户端:
from socket import *
import hmac,os secret_key=b'Jedan has a big key!'
def conn_auth(conn):
'''
验证客户端到服务器的链接
:param conn:
:return:
'''
msg=conn.recv(32)
h=hmac.new(secret_key,msg)
digest=h.digest()
conn.sendall(digest) def client_handler(ip_port,bufsize=1024):
tcp_socket_client=socket(AF_INET,SOCK_STREAM)
tcp_socket_client.connect(ip_port) conn_auth(tcp_socket_client) while True:
data=input('>>: ').strip()
if not data:continue
if data == 'quit':break tcp_socket_client.sendall(data.encode('utf-8'))
respone=tcp_socket_client.recv(bufsize)
print(respone.decode('utf-8'))
tcp_socket_client.close() if __name__ == '__main__':
ip_port=('127.0.0.1',9999)
bufsize=1024
client_handler(ip_port,bufsize)
day29 socketsever ftp功能简单讲解的更多相关文章
- Python socketserver ftp功能简单讲解
socketserver模块实现并发 为什么要讲socketserver?我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它 ...
- python之socketserver ftp功能简单讲解
TCP协议中的socket一次只能和一个客户端通信,然而socketserver可以实现和多个客户端通信. 它是在socket的基础上进行了一层封装,底层还是调用的socket # 服务端 impor ...
- python网络编程--socketserver 和 ftp功能简单说明
1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...
- FTP的搭建与虚拟目录作用<之简单讲解>
操作系统:win7 VS2010编写WebService与在IIS的发布<之简单讲解>中我已经说了IIS安装与使用,不明白的可以跳过去看. 1.添加FTP站点 2. 3. 4. 5. zq ...
- Shiro 核心功能案例讲解 基于SpringBoot 有源码
Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...
- Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...
- 关于SI4432的问题简单讲解
对于SX1278 和SI4432的对比性,下面为大家展示对比参数: 由此可以看出的SI4432虽然跟SX1278有部分地方不同,但是整体来说还是差别不大,各有各的长处和短处,性价比上个人还是觉得SI4 ...
- 常用函数式接口与Stream API简单讲解
常用函数式接口与Stream API简单讲解 Stream简直不要太好使啊!!! 常用函数式接口 Supplier<T>,主要方法:T get(),这是一个生产者,可以提供一个T对象. C ...
- SpringBoot切面Aop的demo简单讲解
前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...
随机推荐
- 牛客网NOIP赛前集训营-提高组(第一场)A 中位数
中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- week02 课堂作业
测试一:(点此看原题目) 运行结果: 测试二:(点此看原题目) 运行结果: 测试三:(点此看原题目) 运行结果:
- p1468 Party Lamps
就是模拟.同一个开关按2下相当于没按,那么,如果一共按0下,就是没按,按1下就是4个开关的1个,按2下可能相当于实际按了0下或按2下,按3下实际按了1下或3下,之后如果是奇数,相当于按1或3下,偶数相 ...
- 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范
一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...
- linux网络配置命令(一)——ifconfig
linux网络配置命令(一)——ifconfig ifconfig 查看.配置网卡信息.已过时,推荐使用ip命令 格式: ifconfig [interface] ...
- Java编码 蛇形矩阵的构建与遍历输出
一.蛇形矩阵的构建,并按行输出 例: 输入:n, 生成n*n的蛇形矩阵 1 2 3 8 9 4 7 6 5 输出:1 2 3 8 9 4 7 6 5 java编码 public static void ...
- 20165309 实验一 Java开发环境的熟悉
20165309 实验一 Java开发环境的熟悉 一.实验内容及步骤 (一)命令行下Java程序开发 在Linux下用ctrl+alt+T打开终端,用mkdir创建文件夹后cd进入. 在vim下键入如 ...
- leetcode_输入一个数组,目标树,检查目标是数组下标的哪两个之和,不准重复
今天是leetcode第一天,但是不太顺利.做这些,想不到 原题目: 我给的答案: class Solution { public: vector<int> twoSum(vector&l ...
- yarn基本命令
参考文章:https://blog.csdn.net/mjzhang1993/article/details/70092902 1.安装 windows: 下载地址 mac: brew install ...
- thinkphp或者kohana 导入和读取文件
1.无论是那个框架的导入,其实都是一样的原理的,但是首先我们要导入包,可能就这点不同. kohana的导入包的方法:require_once(Kohana::find_file('vendor','P ...