今日所学

一.ftp上传简单实例

二.socketsever的固定用法

三.验证合法性连接

1.ftp上传实例

这个题目是我们现在网络编程比较基础一点的题目

下面我们只写简单上传的代码

上传服务端的代码

  1. import socket
  2. import struct
  3. import json
  4. sever=socket.socket()
  5. ip_port=('127.0.0.1',8008)
  6. sever.bind(ip_port)
  7. sever.listen()
  8. conn,addr=sever.accept()
  9. #先接受4个字节,为文件的信息的长度
  10. struct_len_info=conn.recv(4)
  11.  
  12. # 拿到字典的长度,(拿到的结果为元组,从元组中把数据拿出来)
  13. data_len=struct.unpack('i',struct_len_info)[0]
  14.  
  15. # 然后根据拿到的长度,接收字典的字节类型
  16. data_dict_bytes=conn.recv(data_len)
  17.  
  18. # 将字节转换为json字符串类型
  19. data_json=data_dict_bytes.decode('utf-8')
  20.  
  21. # 将json字符串转换为字典
  22. data_dict=json.loads(data_json)
  23.  
  24. sum=0
  25. #算出文件的路径
  26. file_path='相对路径'+'\\'+data_dict['file_name']
  27. with open(file_path,mode='wb') as f:
  28. while sum<data_dict['file_size']:
  29.  
  30. from_client_msg=conn.recv(1024)
  31.  
  32. sum+=len(from_client_msg)
  33.  
  34. f.write(from_client_msg)  

上传客户端代码

  1. import socket
  2. import os
  3. import struct
  4. import json
  5. client=socket.socket()
  6. cleint.connect(('127.0.0.1',8008))
  7. #读取文件的大小(读出来的内容是文件的字节类型)
  8. file_size=os.path.getsize(r'相对路径')
  9. # 在发送真实的文件之前,先将文件的信息包装成字典发送给服务端(文件名字,文件大小,文件路径)
  10. file_info={
  11. 'file_name':'XXX.XXX',
  12. 'file_size' : file_size,
  13. 'file_LuJing': '文件的路径'
  14. }
  15. #将字典序列化成json字符串
  16. file_info_str=json.dumps(file_info)
  17. #将json字符串编码成字节
  18. file_info_byte=file_info_str.encode('utf-8')
  19. #求出字典的字节长度
  20. info_len=len(file_info_byte)
  21. # 打包
  22. info_struct=struct.pack('i',info_len)
  23. # 将打包好的信息和长度发送给服务端
  24. client.send(info_struct+file_info_byte)
  25. with open('你要发送的文件.xxx',mode='rb') as f:
  26. #如果你累加的长度小于文件的长度,让他继续执行
  27. while sum<file_size:
  28. #每次读取的大小最大为1024
  29. every_read=f.read(1024)
  30. sum+=len(every_read)
  31. #将读取到的数据发送给服务端
  32. client.send(every_read)  

注 : 上传和下载只是角色互换而已,上传为客户端向服务端中保存数据,而下载是客户端从服务端的内容中下载相应的文件.

2.socketsever的固定用法

话不多说,上代码

先上传服务端的代码

  1. import socketsever
  2. class 类名(socketsever.BaseRequestHandler):
  3. # 注:这里的handle方法名是固定的,是不允许变的
  4. def handle(self):
  5. while 1:
  6. # self.request相当于conn
  7. from_client_msg=self.request.recv(1024)
  8. print(from_client_msg.decode('utf-8'))
  9. msg=input('服务端说:)
  10. self.request.send(msg.encode('utf-8'))
  11.  
  12. if __name__='__main__':
  13. ip_port=('127.0.0.1',8008)
  14. sever=socketsever.ThreadingTCPSever(ip_port,类名)
  15. sever.serve_forever()
  1. 以下是客户端的代码
  1. import socket
  2. client=socket.socket()
  3. client.connect(('127.0.0.1',8008))
  4. while 1:
  5. msg=input('客户端说>>>')
  6. if msg=='byebye':
  7. break
  8. client.send(msg.encode('utf-8'))
  9. from_sever_msg=client.recv(1024)
  10. print(from_sever_msg.decode('utf-8'))
  11.  
  12. client.close()
  1. 3. 验证合法性连接的服务端
    服务端:
  1. from socket import *
  2. import hmac,os
  3. #秘钥
  4. secret_key=b'Jedan has a big key!'
  5. def conn_auth(conn):
  6.  
  7. print('开始验证新链接的合法性')
  8. msg=os.urandom(32)#生成一个32字节的随机字符串
  9. conn.sendall(msg)
  10. h=hmac.new(secret_key,msg)
  11. digest=h.digest()
  12. respone=conn.recv(len(digest))
  13. return hmac.compare_digest(respone,digest)
  14.  
  15. def data_handler(conn,bufsize=1024):
  16. if not conn_auth(conn):
  17. print('该链接不合法,关闭')
  18. conn.close()
  19. return
  20. print('链接合法,开始通信')
  21. while True:
  22. data=conn.recv(bufsize)
  23. if not data:break
  24. conn.sendall(data.upper())
  25.  
  26. def server_handler(ip_port,bufsize,backlog=5):
  27. '''
  28. 只处理链接
  29. :param ip_port:
  30. :return:
  31. '''
  32. tcp_socket_server=socket(AF_INET,SOCK_STREAM)
  33. tcp_socket_server.bind(ip_port)
  34. tcp_socket_server.listen(backlog)
  35. while True:
  36. conn,addr=tcp_socket_server.accept()
  37. print('新连接[%s:%s]' %(addr[0],addr[1]))
  38. data_handler(conn,bufsize)
  39.  
  40. if __name__ == '__main__':
  41. ip_port=('127.0.0.1',9999)
  42. # 自己定义接收大小
  43. bufsize=1024
  44. server_handler(ip_port,bufsize)

 客户端:

  1. from socket import *
  2. import hmac,os
  3.  
  4. secret_key=b'Jedan has a big key!'
  5. def conn_auth(conn):
  6. '''
  7. 验证客户端到服务器的链接
  8. :param conn:
  9. :return:
  10. '''
  11. msg=conn.recv(32)
  12. h=hmac.new(secret_key,msg)
  13. digest=h.digest()
  14. conn.sendall(digest)
  15.  
  16. def client_handler(ip_port,bufsize=1024):
  17. tcp_socket_client=socket(AF_INET,SOCK_STREAM)
  18. tcp_socket_client.connect(ip_port)
  19.  
  20. conn_auth(tcp_socket_client)
  21.  
  22. while True:
  23. data=input('>>: ').strip()
  24. if not data:continue
  25. if data == 'quit':break
  26.  
  27. tcp_socket_client.sendall(data.encode('utf-8'))
  28. respone=tcp_socket_client.recv(bufsize)
  29. print(respone.decode('utf-8'))
  30. tcp_socket_client.close()
  31.  
  32. if __name__ == '__main__':
  33. ip_port=('127.0.0.1',9999)
  34. bufsize=1024
  35. 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. Unity --- sharedMaterial 、material

    sharedMaterial: 无论如何更新材质的属性,内存中只会存在一份. material: 每次更新材质属性的时候,内存中都会重新new一份material作用于它,直到 Application ...

  2. stm32cube使用

    1.使用stm32cube生成CAN代码注意事项: a.需要手动配置CAN过滤器 { CAN_FilterConfTypeDef sFilterConfig; uint32_t filterID = ...

  3. LeetCode--292--Nim游戏

    问题描述: 你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函 ...

  4. Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。

    Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...

  5. caffe-ssd

    1.安装依赖 1 sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-ser ...

  6. CF1107E Vasya and Binary String

    比赛的时候又被垃圾题艹翻了啊. 这个题显然是区间dp 考虑怎么转移. 类似消除方块和ZYB玩字符串那样的一个DP. 可以从左到右依次考虑消除. dp[l][r][k][flag]表示区间l,r左边粘着 ...

  7. python记录_day018 md5加密

    MD5 用法: import hashlib obj = hashlib.md5(加盐) obj.update(明文的bytes) obj.hexdigest() 获取密文 示例: import ha ...

  8. IDEA中部署tomcat,运行JSP文件,编译后的JSP文件存放地点总结

    首先保证你正常部署了Tomcat,并且正常在浏览器中运行了JSP文件. 那么Tomcat编译后的JSP文件(_jsp.class 和 _jsp.java)的存放地点: (一)一般存放在你安装的Tomc ...

  9. seaweedFS

    那首先我们来分析一下seaweedfs是什么?seaweedfs是一个非常优秀的由 golang 开发的分布式存储开源项目.它是用来存储文件的系统,并且与使用的语言无关,使得文件储存在云端变得非常方便 ...

  10. java中equals与==的比较

    总结来说: 1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等: 如果作用于引用类型的变量,则比较的是所指向的对象的地址 2)对于equals方法,注意:equals方法不 ...