今日所学

一.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功能简单讲解的更多相关文章

  1. Python socketserver ftp功能简单讲解

    socketserver模块实现并发 为什么要讲socketserver?我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它 ...

  2. python之socketserver ftp功能简单讲解

    TCP协议中的socket一次只能和一个客户端通信,然而socketserver可以实现和多个客户端通信. 它是在socket的基础上进行了一层封装,底层还是调用的socket # 服务端 impor ...

  3. python网络编程--socketserver 和 ftp功能简单说明

    1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...

  4. FTP的搭建与虚拟目录作用<之简单讲解>

    操作系统:win7 VS2010编写WebService与在IIS的发布<之简单讲解>中我已经说了IIS安装与使用,不明白的可以跳过去看. 1.添加FTP站点 2. 3. 4. 5. zq ...

  5. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  6. Android事件总线分发库EventBus3.0的简单讲解与实践

    Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...

  7. 关于SI4432的问题简单讲解

    对于SX1278 和SI4432的对比性,下面为大家展示对比参数: 由此可以看出的SI4432虽然跟SX1278有部分地方不同,但是整体来说还是差别不大,各有各的长处和短处,性价比上个人还是觉得SI4 ...

  8. 常用函数式接口与Stream API简单讲解

    常用函数式接口与Stream API简单讲解 Stream简直不要太好使啊!!! 常用函数式接口 Supplier<T>,主要方法:T get(),这是一个生产者,可以提供一个T对象. C ...

  9. SpringBoot切面Aop的demo简单讲解

    前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...

随机推荐

  1. Lambda语法篇

    函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口. Lambda语法 包含三个部分 一个括号内用逗号分隔 ...

  2. MYSQL去除"/r/n"

    #去除回车符号/r/n UPDATE t_week_power_line_loss SET `line_loss_rate` = REPLACE( REPLACE( `line_loss_rate` ...

  3. HTTP 权威指南 第二章 URL 与资源

    前言 这一章节讲述了关于 URL 的相关知识,主要包括下面的内容: URL 语法 URL 快捷方式 URL 编码与字符规则 常见的 URL 方案 URL 的未来——URN URL 语法 一般格式(九个 ...

  4. 20171022xlVBA练手提取入所记录

    Sub GetWordText改进() Dim Wb As Workbook Dim Sht As Worksheet Dim Rng As Range Dim wdApp As Object Dim ...

  5. Elsevier系旗下期刊论文投稿流程

    目录 1.上传文件需求 2.注册账号和填写相关信息 3.以作者身份登入 4.开始提交论文:点击submit New Manuscript 5.选择论文类型:一般是科技长文Full Length Art ...

  6. 【洛谷p1403 】【AHOI2005】约数研究

    (有种失踪人口回归的感觉) 约束研究[传送门] (不过好像没有人注意到我这个蒟蒻) 好的不管它啦 最近学数论比较多,所以可能会有好多好多的数论题???(不存在的) 行吧上算法标签: 数论   数论  ...

  7. 【洛谷p1015】【一本通p1309】回文数(noip1999)

    (过了这个题灰常灰常开心) 好像前两道忘记了传送门: 回文数[传送门] 洛谷算法标签: 其实还有高精度 这个题困死在了十六进制,后来想了想,我们在c[i]中存入一个大于十的数之前的程序也可以实现回文( ...

  8. python面向对象之 类的关系

    内容梗概: 1. 依赖关系 2. 关联关系, 组合关系, 聚合关系 3. 继承关系, self到底是什什么鬼? 4. 类中的特殊成员 1. 依赖关系def:在方法中给方法传递一个对象. 此时类与类之间 ...

  9. bzoj3876: [Ahoi2014&Jsoi2014]支线剧情

    题意:给一幅图,从1开始,每条边有边权最少走一遍,可以在任意点退出,问最小花费 题解:上下界费用流,每个边都流一遍,然后为了保证流量平衡,新建源点汇点,跑费用流把流量平衡 /************* ...

  10. win7 64安装msyql

    https://www.cnblogs.com/orrz/p/5456247.html 1:下载安装包,等待等待的过程,OK,在短暂的等待后,下载完成,解压先,简单起见,解压到D盘吧,D:\mysql ...