本周安排

周二 socket编程
周三 粘包处理
周四 选课系统
并发编程
周五多道技术 多进程
周六 IPC 互斥锁

常用模块 os* 操作系统 多数是文件操作 os.path 处理文件路径 shutil 高级文件处理模块 用起来更方便 sys 解释器相关 json* 一种序列化方式 json可以支持跨平台 pickle 一种序列化方式 仅在python可用 re* 正则表达式 用于处理字符串 主要是查找 匹配 验证 爬虫中 验证用户输入是否合法 hashlib* hash一种算法 输入一段任意长度的数据 输出一段固定长度的字符 也称之为特征码 用于加密 和 数据校验

logging* 输出日志(程序运行的日记 是为了 日后出现问题 有迹可循)  用字典来配置  需包含 handler formater filter logger

configparser   解析配置文件的模块   配置文件中只能有分区个选项

xml  可扩展标记语言  其优势在于 可以自定义文档的结构 如HTML中有头有尾
学习的重点是如何读取xml文档 并找到需要的标签 time* 时间相关的 time.time() 获取时间戳 time.sleep() 让程序休眠指定时间 subproces 子进程 由一个正在运行的程序开启的另一个程序 称之为子进程 当当前程序 无法处理用户请求 但是另一个程序可以处理时
qq 中点击网页链接 会打开浏览器 random* 随机数相关 抽奖 验证码 随机点名 shelve 序列化方式 只有一个open函数
其使用方式与字典一致 相当于一个自带序列化的字典

面向对象 一种编程思想 核心概念 类与对象 对象是什么? 具备某些特征和技能的结合体 是实际存在的 类是 一系列具备相同特征和技能的集合体 是一种抽象概念

三大特性
封装
隐藏内部实现细节 多外提供使用接口
提高安全性 隔离复杂度 明确区分内外
被封装的函数和属性 只能在当前类中使用
继承
是一种类与类之间的关系
有了继承关系后 子类可以使用父类中已经存在的属性和方法
其目的是减少代码冗余
python 可以多继承
属性查找顺序按照mro列表的顺序
c3算法 如果存在菱形继承 先深度 (遇见了公共父类)在广度
不存在菱形 则 深度优先
多态
一个事物具备多种形态
例如一个动物 有多种形态 如 猪狗牛羊
不同的对象具备相同的方法 会产生不同结果 要实现多态性 需要 先抽象得到到公共父类 然后子类去继承父类 并且覆盖父类中声明的方法
abc模块可以强制子类必须实现父类的方法 python中推荐鸭子类型 只要具备相同的方法就可以看做同一个类 绑定方法
对象绑定方法
类绑定方法
绑定给谁 就由谁来调用 并且在调用时 自动传入 对象或者类 非绑定方法
就是一个普通的函数 面向对象的精髓 就是 把数据和处理数据的方法进行绑定

异常 什么是异常 程序运行的时候出现了错误 程序会立即停止执行 为什么要学习异常 是为了保证程序可以正常执行结束 为了提高程序的健壮性 如何处理异常 try 可能出现异常的代码 except 异常的类型 打印异常信息 尝试处理异常

else
没有出现异常时执行
finally
无论是否出现异常 最后都会执行
可以做清理操作 自定义异常类型
继承Exception
主动抛出异常
raise 任何Exception的子类 或者 其对象 万能异常
Exception 一定要打印异常信息 异常组成
异常的类型
异常的值
追踪信息 找最后一行 把它翻译一下
如果最后一行不是你写的而是模块内部的 那就找你写最后一行

网络编程

编写基于网络通讯的应用程序 1.七层模型 应用层

传输层
TCP/UDP工作在传输层
要求 要联网的应用程序必具备端口号
用于定位某台计算机上的某个应用程序
TCP
三次握手 建立连接
四次挥手 断开连接
为了保证数据的完整性 网络层
ip协议
ip地址 四个十进制数 前三个是网络号 后一位是主机号 主机号为1是网关
网关之间通过路由协议来找到对方 有了ip之后 可以在全世界范围内定为到一台计算机 链路层
解析二进制的数据
以太网协议工作在该层
规定了二进制数据的分组方式
一段二进制数据称之为数据帧 1518
包含 head和data 还规定了一个计算机必须有MAC地址 通过MAC就能定位局域网内的一台计算机 物理层: 物理传输介质
网线 光纤 无线网络
能传输二进制数据 recv(1024)阻塞:直到操作系统缓冲区有数据为止

基础班

服务器端

import socket

# 买手机 默认得到是一个TCP的socket
server = socket.socket() # 两行代码的效果是一样的
# socket的家族 AF_INET
# socket的类型
# SOCK_STREAM 对应的是TCP SOCK_DGRAM 对应的是UDP # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
# 创建基于UDP的socket
# server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) server.bind(("127.0.0.1",16888)) # 绑定手机卡 server.listen() # 开始待机 # 得到对方的socket对象与地址
client,addr = server.accept() # 接收通话请求 # 该函数会阻塞 直到有连接请求过来 print("==========")
# buffersize 表示应用程序的缓冲区大小 recv其实是 从系统缓冲区读取数据到应用程序
data = client.recv(1024) # 该函数会阻塞 直到操作缓冲区有数据位置
print("==========") print("收到客户端发来的数据:%s" % data.decode("utf-8")) # 发生的数据必须为bytes类型
client.send(data) client.close() #挂断电话 server.close() # 关机

普通版 客户端

import socket

client = socket.socket()

client.connect(("127.0.0.1",16888))

client.send("hello 服务器".encode("utf-8"))

print("===================")
data = client.recv(1024) # 该函数会阻塞 直到操作缓冲区有数据位置
print("===================") print("收到服务器:%s" % data.decode("utf-8")) client.close()

服务器 循环版

import socket

# 买手机 默认得到是一个TCP的socket
server = socket.socket() # 两行代码的效果是一样的
# socket的家族 AF_INET
# socket的类型
# SOCK_STREAM 对应的是TCP SOCK_DGRAM 对应的是UDP # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
# 创建基于UDP的socket
# server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) server.bind(("127.0.0.1",16888)) # 绑定手机卡 server.listen() # 开始待机 # 连接循环 可以不断接受新连接
while True:
client, addr = server.accept() # 通讯循环 可以不断的收发数据
while True:
try:
# 如果是windows 对方强行关闭连接 会抛出异常
# 如果是linux 不会抛出异常 会死循环收到空的数据包
data = client.recv(1024)
if not data:
client.close()
break print("收到客户端发来的数据:%s" % data.decode("utf-8"))
client.send(data)
except ConnectionResetError:
print("客户端强行关闭了连接")
client.close()
break
client.close() #挂断电话
server.close() # 关机

客户端 循环版

import socket

client = socket.socket()

client.connect(("127.0.0.1",16888))

while True:
msg = input(">:")
client.send(msg.encode("utf-8"))
data = client.recv(1024)
print("收到服务器:%s" % data.decode("utf-8")) client.close()

UDP 服务端

import socket

# UDP协议 在创建socket是 只有一个类型不同
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,proto=0) server.bind(("127.0.0.1",8888)) while True:
data,addr = server.recvfrom(1024) # 阻塞 直到收到数据为止
print("收到来自%s的消息:%s" % (data.decode("utf-8"),addr[0]))
# 返回值为 数据 和 对方ip地址 和端口号
server.sendto(data.upper(),addr) print(res)
server.close()

UDP客户端

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)

while True:
data = input(">>:").encode("utf-8")
client.sendto(data,("127.0.0.1",8888))
d,addr = client.recvfrom(1024)
print(d.decode("utf-8")) client.close()

半连接池

服务端保存的未完成三次握手的连接的数量,超过一定数量后,再有新的连接请求过来,就不处理了,让请求等待

服务器端模拟

import  socket

server = socket.socket()

server.bind(("127.0.0.1",8888))

# 参数可以设置最大的半连接数   最大5个
server.listen() import time
while True:
time.sleep(0.5)

day30 UDP协议的更多相关文章

  1. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  2. 闲来无事,写个基于UDP协议的Socket通讯Demo

    项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...

  3. UDP协议开发

    UDP是用户数据报协议(User Datagram Protocol,UDP)的简称,其主要作用是将网络数据流量压缩成数据报形式,提供面向事务的简单信息传送服务.与TCP协议不同,UDP协议直接利用I ...

  4. 基于UDP协议模拟的一个TCP协议传输系统

    TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...

  5. TCP协议与UDP协议的区别

    TCP协议与UDP协议的区别(转) 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  6. 采用UDP协议的PIC32MZ ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 经过千辛万苦,今天终于 ...

  7. 采用UDP协议实现PIC18F97J60 ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). TCP/IP Stac ...

  8. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  9. Linux内核--网络栈实现分析(九)--传输层之UDP协议(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7549340 更多请查看专栏,地 ...

随机推荐

  1. HTML+CSS盒模型

    一.Padding 1.padding用来调整内容在容器中的位置关系:padding的属性要添加到父元素上. padding值是额外加在元素原有的大小之上的,若想保证元素大小不变,需从元素宽或高上  ...

  2. cookie、localStorage、sessionStorage和会话控制机制

    简介 cookie cookie的内容主要包括:名字Name.值Value.域Domain.路径Path.过期时间Expires/Max-Age.大小Size.HTTP.Secure.SameSite ...

  3. 使用jquery刷新当前页面、刷新父级页面

    如何使用jquery刷新当前页面 下面介绍全页面刷新方法:有时候可能会用到 window.location.reload(); //刷新当前页面.(我用的这个一个,非常好) parent.locati ...

  4. react-native启动页面设置,react-native-splash-screen

    用于解决iOS和Android启动白屏问题及简单的启动页面展示 下载 react-native-splash-screen yarn add react-native-splash-screen re ...

  5. ios http请求 配置

    需要在xcode 中配置下才能请求

  6. golang redis集群操作:redis-go-cluster

    背景 感觉redis-cli desktop及其难用,最近用golang做了个redis查询工具,支持单例和集群操作,终于不再卡顿!!! 用到的包 "github.com/garyburd/ ...

  7. AIR程序调用本地默认应用程序打开本地文件

    当我用下面语句的时候,可以成功打开桌面文件夹下面的文件: var file:File = File.desktopDirectory.resolvePath("test.jpg") ...

  8. Django--views(视图层)

    路径匹配后-----传给视图函数 一.视图函数 视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse) 一个视图函数,简称视图,是一个简单的Python 函数, ...

  9. xcode 自动签名、手动签名

    手动签名:需要手动生成p12文件(私钥),然后将对应的公钥上传到开发者网站,生成证书,进一步生成对应的描述文件,然后在xcode中手动指定描述文件,这个描述文件中包含与本地p12文件对应的证书. 自动 ...

  10. ISPF常用命令

    [ISPF功能键] PF1: HELP帮助键 PF2: SPLIT键,改变分屏位置 PF3: END键,结束并退回上级菜单 PF4: RETURN键,结束并退回主菜单 PF5: REFIND键,重复最 ...