摘要

  一到放假就杂事很多,这次的作业比较复杂,做了一个周,进度又拖了。不过结果还不错。

正文

粘包

  在上一节中,如果连续发送过多数据,就可能发生粘包。粘包就是两次发送的数据粘在一起被接收,损坏了数据的完整性。解决方法有两种。

  方案一:

    在发送多个数据之间添加接收确认。这样在完成一次发送以后只有接收到另一端的确认以后才会开始新的发送,避免了粘包的发生。

  方案二:

    首先将发送数据的大小发送给另一端,另一端根据数据的大小接收。一次接收一次发送的数据量,这样也就避免了数据的粘包。例子。

#方案1
#server
f = open(path, 'wb')
for i in f:server.socket.send(i)
f.close()
server.socket.recv(1024)
server.socket.send(b'发送完毕')
#client
recv_data = ''
while True:data = client.socket.recv(1024)if not data:breakrecv_data += data
client.socket.send(b'recv over')
other_data = client.socket.recv(1024)
#方案2
#server
size = os.path.getsize(path)
server.socket.send(size.encode())
server.socket.recv(1024)
f = open(path, 'wb')
for i in f:server.socket.send(i)
f.close()
server.socket.send(b'发送完毕')
#client
size = client.socket.recv(1024)
client.socket.send(b'start')
recv_data = ''
recv_size = 0
while recv_size < size:if size - recv_size < 1024:single_size = size - recv_sizeelse:single_size = 1024data = client.socket.recv(single_size)recv_size += len(data)recv_data += data
other_data = client.socket.recv(1024)

View Code

FTP

  一个简单的FTP过程主要包含以下几个步骤。

  1.读取文件名

  2.检测文件是否存在

  3.打开文件

  4.检测文件大小,文件名

  5.发送文件大小 md5值给客户端

  6.等待客户端确认

  7.开始边读取数据边发送数据

  8.md5确认

  具体例子。

  服务器

# 服务器端
import socket
import os
import  hashlibserver = socket.socket()
server.bind(('localhost', 9999))
server.listen()while True:conn, addr = server.accept()print('new conn:', addr)while True:data = conn.recv(1024)data = data.decode()if not data:print('客户端已断开')breakcmd, filename = data.split()print(filename)if os.path.isfile(filename):f = open(filename, 'rb')m = hashlib.md5()file_size = os.stat(filename).st_sizeprint(file_size)conn.send(str(file_size).encode('utf-8'))conn.recv(1024)for line in f:m.update(line)conn.send(line)print('md5:', m.hexdigest())f.close()conn.send(m.hexdigest().encode('utf-8'))

View Code

  客户端

# 客户端
import socket
import hashlibclient = socket.socket()
client.connect(('localhost', 9999))while True:cmd = input('>>').strip()if len(cmd) == 0:continueif cmd.startswith('get'):client.send(cmd.encode('utf-8'))cmd_res_size = client.recv(1024)  # 接收长度print('文件大小 %s' % (cmd_res_size.decode()))client.send('准备完毕,开始发送数据'.encode('utf-8'))recv_size = 0file_name = cmd.split()[1]f = open(file_name + '.new', 'wb')m = hashlib.md5()while recv_size < int(cmd_res_size.decode()):if int(cmd_res_size.decode()) - recv_size > 1024:size = 1024else:size = int(cmd_res_size.decode()) - recv_sizedata = client.recv(size)recv_size += len(data)  # 读取每次接收的数据
            f.write(data)m.update(data)#print(recv_size)else:file_md5 = m.hexdigest()print('文件接收完毕', recv_size)f.close()recv_md5 = client.recv(1024)print(file_md5, recv_md5.decode())
client.close()

View Code

SocketServer

  SocketServer是Python的一个包,它在socket的基础上封装,可以更加简单的完成并发处理。

  socketserver.TCPServer 继承BaseServer,完成TCP

  socketserver.UDPServer 继承TCPServer,完成UDP

  socketserver.UnixStreamServer 继承TCPServer,完成Unix的TCP

  socketserver.UnixDatagramServer 继承UDPServer,完成Unix的UDP

  使用socketserver的步骤:

  1.创建一个请求处理类,并且这个类要继承BaseRequestHandler,并且需要重写父类中的Handle()方法。

  2.实例化一个Server类,并且传递Server ip和1中创建的请求处理类给它。

  3.server.handle_request()只处理一个请求 server.server_forever()处理多个请求,永久执行。

  4.调用server_close()关闭它。

  BaseServer中的常用方法,例子。

fileno() # 返回文件描述符
handle_request # 处理单个请求
serve_forever(poll_interval=0.5) # 一直运行直到收到shutdown()请求,每poll_interval检查一次,后调用service_actions()结束
service_actions() # 结束操作
shutdown() # 停止信号
server_close() # 清除server
address_family # 地址簇
RequestHandlerClass # 请求处理类
server_address # ip地址
socket # 同socket
self.allow_reuse_adress # 允许重用地址 socket中socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
socket_type # socket使用的协议类型
self.setup() # 请求来之前 self.handle() # 请求来时 self.finish() # 请求处理之后

View Code

作业

  1.用户加密认证

  2.允许多个用户登陆

  3.每个用户有自己的家目录,不能互相访问

  4.对用户进行磁盘配额,可用空间不同

  5.允许用户在ftp_server上随意切换目录

  6.允许用户查看当前目录文件

  7.允许用户上传下载文件,保证文件一致性

  8.传输过程显示进度条

  作业

转载于:https://www.cnblogs.com/zk71124720/p/9407286.html

NO.8:自学python之路------并行socket网络编程相关推荐

  1. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  2. Python之旅Day8 socket网络编程

    socket网络编程 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定 ...

  3. Python多用户在线聊天系统(Socket网络编程),控制台输出版

    运行情况 服务端 客户端 服务端代码 import socket import threading# 创建TCP Socket, 类型为服务器之间网络通信,流式Socket mySocket = so ...

  4. 我自学python的路-Python学习路线图的总结

    原标题:Python学习路线图的总结 如何学习Python 对于Python学习爱好者来说 一个良好的学习脉络特别重要,可以让学习事半功倍.如果你也是想系统的学习python技术,你可以看看 小编一直 ...

  5. python运维开发之socket网络编程01

    python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...

  6. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  7. python网络编程讲解_详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  8. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信

    目录 前言 IP地址 简介 公有IP 私有IP 局域网之间网络通信 前提 功能描述 源码 运行结果 局域网与广域网网络通信 前提 源码 结语 前言 本系列博客是笔者学习Python Socket的过程 ...

  9. Python Socket网络编程(一)初识Socket和Socket初步使用

    目录 前言 网络编程 实质 IP地址和端口 数据传输协议 协议 Socket 概念 套接字 socket对象方法 初步使用 功能 源码 运行结果 结语 前言 本系列博客是笔者学习Python Sock ...

最新文章

  1. 编译内核出现make CONFIG_DEBUG_SECTION_MISMATCH=y错误
  2. Arrays.asList问题
  3. 如何在Oracle11中配置st_shapelib
  4. Linux查看当前http连接,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  5. 【EasyUI】DataGrid实现表格的筛选过滤、排序
  6. Java基本sql_常用sql
  7. java 拼图_拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?
  8. (转)Hibernate框架基础——映射普通属性
  9. 【HTML+CSS网页设计与布局 从入门到精通】第10章-CSS
  10. BS前台能力迅速提高
  11. OSChina 周日乱弹 —— 致 OSCer 的中秋祝福
  12. 水表模型更新--170323
  13. 项目管理-项目风险管理
  14. Web UI设计基础
  15. 穿越火线枪战王者服务器维护,CF手游体验服7.3维护公告 战争风云模式登场
  16. ios零基础学习 准备什么,如何去学习
  17. 计算机科学家手抄报图片,关于简洁又漂亮的科学手抄报图片
  18. Three.js地球开发—6.三维球面上某点进行贴图标注
  19. 什么是桌面虚拟化,实施桌面虚拟化有什么好处?
  20. Ordinal numeral

热门文章

  1. 6.Excel项目排期表
  2. Scrum基础知识体系和感想
  3. 列举ospf的5种报文类型_OSPF的5种报文类型
  4. Codeforces 1291 Round #616 (Div. 2) C. Mind Control(超级详细)
  5. [深度学习] 自然语言处理 --- ALBERT 介绍
  6. 常用串口调试工具比较
  7. 全志A33-BootLoader的两个阶段:boot0和second boot
  8. 第四大运营商正式申请5G牌照,三大运营商如何应对?
  9. 为什么银行大额存单没有4年期?想存4年期怎么办?
  10. SVM学习——在matlab上安装libsvm库(一)