1.上传下载的简单示例
server:
import socket
import struct
import json
 
server =socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
conn,addr = server.accept()
 
#首先接收文件的描述信息的长度
struct_data_len = conn.recv(4)
data_len = struct.unpack('i',struct_data_len)[0]
 
#通过文件信息的长度将文件的描述信息全部接收
print('data_len>>>>',data_len)
file_info_bytes =conn.recv(data_len)
# 将文件描述信息转换为字典类型,以便操作
file_info_json = file_info_bytes.decode('utf-8')
file_info_dict = json.loads(file_info_json)  ##{'file_name': 'aaa.mp4', 'file_size': 24409470}
 
 
print(file_info_dict)
#统计每次接收的累计长度
recv_sum =0
 
flie_path= 'D:\s18\jj' +'\\' + file_info_dict['file_name']
 
with open(flie_path, 'wb') as f:
    while recv_sum < file_info_dict['fil_size']:
        every_recv_data = conn.recv(1024)
        recv_sum += len(every_recv_data)
        f.write(every_recv_data)
client:
import os
import socket
import json
import struct
 
client = socket.socket()
client.connect(('127.0.0.1',8001))
 
#统计文件大小
file_size = os.path.getsize(r'D:\python_workspace_s18\day029\aaa.mp4')
# 统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放点一个字典里面了
file_info ={
    'file_name':'aaa.mp4',
    'file_size':file_size
}
#由于字典无法直接为转换成bytes类型的数据,所以需要json来讲字典转换成json字符串,在把字符串转换成字节类型的数据进行发送
#json.dumps是将字典转转换为json字符串的方法
file_info_json = json.dumps(file_info)
#将字符串转换成bytes类型的数据
file_info_byte = file_info_json.encode('utf-8')
#为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去
data_len = len(file_info_byte)
data_len_struct = struct.pack('i',data_len)
#发送文件描述信息
client.send(data_len_struct+file_info_byte)
#定义一个变量,=0,作为每次读取文件的长度的累计值
sum = 0
#打开的aaa.mp4文件,rb的形式
with open('aaa.mp4','rb') as f:
    #循环读取文件内容
    while sum < file_size:
        #每次读取的文件内容,每次读取1024B大小的数据
        every_read_data = f.read(1024)
        #将每次读取的文件的真实数据反送给服务器
        sum +=len(every_read_data)
 
        client.send(every_read_data)
2.socketserver模块实现并发
用socketserver可以实现和多个客户端通信,它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket.
实例:
server端:
import socketserver
# 自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的类BaseRequestHandler
class Myserver(socketserver.BaseRequestHandler):
    #写一个handle方法,必须叫这个名字
    def handle(self):
        #self.request   #self.request相当于一个conn
        while 1:
            from_client_msg = self.request.recv(1024) #self.request = conn
            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',8001)
   #设置 allow_reuse_adress允许服务器重用地址
    socketserver.TCPServer.allow_reuse_adress = True
   #thread线程
   #使用socketserver的ThreadingTCPServer这个类,将ip和端口的元组传进去,还需要将上面咱么定义的类传进去,得到一个对象相当于我们通过它进行了bind,listen
    server = socketserver.ThreadingTCPServer(ip_port,Myserver)
    #使用我们上面这个类型的对象来执行server_foever()这个方法,服务会一直开启,就先京东网站一样,不能关闭网站,server_foever()帮我们进行了accept
    server.serve_forever()
client端:
 
import socket
# 创建一个socket链接,SOCK_STREAM代表使用TCP协议
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接到客户端
client.connect(('127.0.0.1',8001))
 
while 1:
    msg = input('客户端说:')
    client.send(msg.encode('uft-8'))
    from_server_msg = client.recv(1024)
 
    print(from_server_msg.decode('utf-8'))
3.验证客户端的连接合法性
首先介绍两种方法:
 1.os.urandom(n)
其中os.urandom(n)是一种bytes类型的随机生成n个字节字符串的方法,而且每次生成的值都不相同。再加上md5等加密的处理。就能够形成不同长度相同的字符串了。
os.urandom(n)函数在python官方文档中做出了这样的解释
函数定位:Return a string of n random bytessuitable for cryptographic use.
意思就是,返回一个有n个bytes那么长的string,然后很适合加密。
然后在这个函数中,在文档中,被归结于os这个库的Miscellaneous Functions,意思是不同种类的函数(也可以说是混种函数)
原因是:This function returns random bytes from an OS-specific randomness source
(函数返回的随机字节是根据不同的操作系统特定的随机函数资源。即,这个函数是调用OS内部自带的随机函数,有特异性)
使用的方法:
import  os
from hashlib import md5
for i in range(10):
    print (md5(os.urandom(24)).hexdigest())
 2.hamc:我们完全可以用hashlib来实现,python自带的hmac模块实现了标准的Hmac算法,首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:
可见的使用hmac和普通hash算法非常类似,hmac输出的长度和原始哈希算法的长度一致。需要注意的是传入的key和message都是bytes类型,str类型需要首先编码bytes。
 
import hmac
import random
message = b'Hello world'
key = b'secret'
h = hmac.new(key,message,digestmod='MD5')
print(h.hexdigest())
# 比较两个密文是否相同,可以用hmac.compara_digest(密文,密文),会返回True或者False。def hmac_md5(key,s):
    return hmac.new(key.encode('utf-8'),s.encode('utf-8'),'MD5').hexdigest()
 
class User(object):
    def __init__(self,username,password):
        self.username = username
        self.key = ''.join([chr(random.randint(48,122)) for i in range(20)])
        self.password = hmac_md5(self.key,password)
验证客户端合法性连接实例
server端:
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)
client端:
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)
 
1.上传下载的简单示例
server:
import socket
import struct
import json
 
server =socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
conn,addr = server.accept()
 
#首先接收文件的描述信息的长度
struct_data_len = conn.recv(4)
data_len = struct.unpack('i',struct_data_len)[0]
 
#通过文件信息的长度将文件的描述信息全部接收
print('data_len>>>>',data_len)
file_info_bytes =conn.recv(data_len)
# 将文件描述信息转换为字典类型,以便操作
file_info_json = file_info_bytes.decode('utf-8')
file_info_dict = json.loads(file_info_json)  ##{'file_name': 'aaa.mp4', 'file_size': 24409470}
 
 
print(file_info_dict)
#统计每次接收的累计长度
recv_sum =0
 
flie_path= 'D:\s18\jj' +'\\' + file_info_dict['file_name']
 
with open(flie_path, 'wb') as f:
    while recv_sum < file_info_dict['fil_size']:
        every_recv_data = conn.recv(1024)
        recv_sum += len(every_recv_data)
        f.write(every_recv_data)
client:
import os
import socket
import json
import struct
 
client = socket.socket()
client.connect(('127.0.0.1',8001))
 
#统计文件大小
file_size = os.path.getsize(r'D:\python_workspace_s18\day029\aaa.mp4')
# 统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放点一个字典里面了
file_info ={
    'file_name':'aaa.mp4',
    'file_size':file_size
}
#由于字典无法直接为转换成bytes类型的数据,所以需要json来讲字典转换成json字符串,在把字符串转换成字节类型的数据进行发送
#json.dumps是将字典转转换为json字符串的方法
file_info_json = json.dumps(file_info)
#将字符串转换成bytes类型的数据
file_info_byte = file_info_json.encode('utf-8')
#为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去
data_len = len(file_info_byte)
data_len_struct = struct.pack('i',data_len)
#发送文件描述信息
client.send(data_len_struct+file_info_byte)
#定义一个变量,=0,作为每次读取文件的长度的累计值
sum = 0
#打开的aaa.mp4文件,rb的形式
with open('aaa.mp4','rb') as f:
    #循环读取文件内容
    while sum < file_size:
        #每次读取的文件内容,每次读取1024B大小的数据
        every_read_data = f.read(1024)
        #将每次读取的文件的真实数据反送给服务器
        sum +=len(every_read_data)
 
        client.send(every_read_data)
2.socketserver模块实现并发
用socketserver可以实现和多个客户端通信,它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket.
实例:
server端:
import socketserver
# 自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的类BaseRequestHandler
class Myserver(socketserver.BaseRequestHandler):
    #写一个handle方法,必须叫这个名字
    def handle(self):
        #self.request   #self.request相当于一个conn
        while 1:
            from_client_msg = self.request.recv(1024) #self.request = conn
            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',8001)
   #设置 allow_reuse_adress允许服务器重用地址
    socketserver.TCPServer.allow_reuse_adress = True
   #thread线程
   #使用socketserver的ThreadingTCPServer这个类,将ip和端口的元组传进去,还需要将上面咱么定义的类传进去,得到一个对象相当于我们通过它进行了bind,listen
    server = socketserver.ThreadingTCPServer(ip_port,Myserver)
    #使用我们上面这个类型的对象来执行server_foever()这个方法,服务会一直开启,就先京东网站一样,不能关闭网站,server_foever()帮我们进行了accept
    server.serve_forever()
client端:
 
import socket
# 创建一个socket链接,SOCK_STREAM代表使用TCP协议
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接到客户端
client.connect(('127.0.0.1',8001))
 
while 1:
    msg = input('客户端说:')
    client.send(msg.encode('uft-8'))
    from_server_msg = client.recv(1024)
 
    print(from_server_msg.decode('utf-8'))
3.验证客户端的连接合法性
首先介绍两种方法:
 1.os.urandom(n)
其中os.urandom(n)是一种bytes类型的随机生成n个字节字符串的方法,而且每次生成的值都不相同。再加上md5等加密的处理。就能够形成不同长度相同的字符串了。
os.urandom(n)函数在python官方文档中做出了这样的解释
函数定位:Return a string of n random bytessuitable for cryptographic use.
意思就是,返回一个有n个bytes那么长的string,然后很适合加密。
然后在这个函数中,在文档中,被归结于os这个库的Miscellaneous Functions,意思是不同种类的函数(也可以说是混种函数)
原因是:This function returns random bytes from an OS-specific randomness source
(函数返回的随机字节是根据不同的操作系统特定的随机函数资源。即,这个函数是调用OS内部自带的随机函数,有特异性)
使用的方法:
import  os
from hashlib import md5
for i in range(10):
    print (md5(os.urandom(24)).hexdigest())
 2.hamc:我们完全可以用hashlib来实现,python自带的hmac模块实现了标准的Hmac算法,首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:
可见的使用hmac和普通hash算法非常类似,hmac输出的长度和原始哈希算法的长度一致。需要注意的是传入的key和message都是bytes类型,str类型需要首先编码bytes。
 
import hmac
import random
message = b'Hello world'
key = b'secret'
h = hmac.new(key,message,digestmod='MD5')
print(h.hexdigest())
# 比较两个密文是否相同,可以用hmac.compara_digest(密文,密文),会返回True或者False。def hmac_md5(key,s):
    return hmac.new(key.encode('utf-8'),s.encode('utf-8'),'MD5').hexdigest()
 
class User(object):
    def __init__(self,username,password):
        self.username = username
        self.key = ''.join([chr(random.randint(48,122)) for i in range(20)])
        self.password = hmac_md5(self.key,password)
验证客户端合法性连接实例
server端:
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)
client端:
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)
 

day 29 socketserver ftp功能的简单讲解的更多相关文章

  1. Python socketserver ftp功能简单讲解

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

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

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

  3. socketserver + ftp

    --------------------------------------------生活不止眼前的苟且,还有诗和远方的田野. day 29 socketserver + ftp # # ----- ...

  4. day29 socketsever ftp功能简单讲解

    今日所学 一.ftp上传简单实例 二.socketsever的固定用法 三.验证合法性连接 1.ftp上传实例 这个题目是我们现在网络编程比较基础一点的题目 下面我们只写简单上传的代码 上传服务端的代 ...

  5. python socketserver ftp上传功能

    一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...

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

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

  7. 网络编程4 网络编程之FTP上传简单示例&socketserver介绍&验证合法性连接

    今日大纲: 1.FTP上传简单示例(详细代码) 2.socketserver简单示例&源码介绍 3.验证合法性连接//[秘钥加密(urandom,sendall)(注意:中文的!不能用)] 内 ...

  8. 29 Socketserver和 ftp

    一.Socketserver #服务端 import socketserver class KnightServer(socketserver.BaseRequestHandler): def han ...

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

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

随机推荐

  1. PHP and laravel知识点小小积累

    function () use ($x, &$y){} 自从PHP5.3开始有了closure/匿名函数的概念,在这里的use关键词的作用是允许匿名函数capture到父函数scope 内存在 ...

  2. phantomjs rendering

    http://wwwy3y3.ghost.io/pageres-phantomjs-capture-sreenshot-chinese-fonts-not-render-correctly/ 在使用中 ...

  3. 微软发布SQL Server on Linux

    本文参考并翻译自:微软云计算与企业执行副总裁Scott Guthrie的博客. 过去的一年,不管是对于微软的数据业务,还是整个行业,都是令人惊喜的一年.在周四刚于纽约举行的Data Driven活动中 ...

  4. C++ inheritance examples

    1.C++继承经典例子 #include <iostream> using namespace std; class Base { private: int b_number; publi ...

  5. Java学习笔记——关于位运算符的问题

    我就之直接贴图了!不想排版了! 有什么问题,欢迎大家指出,帮助我提高,谢谢!

  6. 【Leetcode】【Medium】Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  7. JS 获取指定日期的前几天,后几天

    function getNextDate(date,day) { var dd = new Date(date); dd.setDate(dd.getDate() + day); var y = dd ...

  8. 常规渗透:没遇到过的anquan狗

    0x01 信息收集 服务器信息: windows 2003 + IIS 6.0 + aspx . Php + 安全狗 站点cms信息:一套aspx新闻发布系统 和 Discuz X3 端口信息 : 服 ...

  9. web API之post参数传递

    最近公司开发一个新产品,前端用的vue+element,后端用的.net core ,刚开始接触这块,接口写完后在调用接口时总出现问题,尤其是post传递参数时,很多时候都获取不到参数,没办法接口都要 ...

  10. c++ 读取文本问题

    c++文本操作有以下三个方法 ifstream,ofstream,fstream 读取文本常用的方法如下 std::ifstream input; input.open(".log" ...