Python 高级网络操作 - Python Advanced Network Operations

  1 Python 高级网络操作 - Python Advanced Network Operations
  2 
  3 Half Open Socket,
  4     一个单向的 socket 被称为 half open socket, 即数据只能在一个方向上传输.
  5     Half Open Socket 是通过在 socket 对象上调用 shutdown() 方法得到.
  6     shutdown 接收一个 numeric 类型的参数,
  7         0 - 表示调用之后禁止读
  8         1 - 表示调用之后禁止写
  9         2 - 表示调用之后禁止读和写
 10     一旦关闭了某一个方向(读/写), socket 就不能再在该方向上被重新打开了.
 11     shutdown()是累计的, 也就是调用 shutdown(0) 再调用 shutdown(1) 跟
 12     直接调用一个  shutdown(2) 效果是一样的.
 13 
 14     Half Open Socket 通常被应用在一下儿 3 种情形中,
 15         1, 想要确保所有写好的数据都已经被传送出去.
 16             调用 shutdown()的时候, 只有在缓存里面的数据都被成功发出去后方法才会有返回.
 17         2, 用来 debug, 捕获潜在的异常/错误.
 18             Half Open Socket 是捕获试图写一个不可写的 socket, 或者读一个不可读
 19             的 socket 的异常的好方法.
 20         3, 在程序是用了 fork() 或 多线程的时候, 用来防止其他进程/线程的某些操作.
 21 
 22 socket 超时 - socket timeout
 23     settimeout(seconds)
 24         对一个 socket 对象调用 settimeout(secs) 方法后, 如果经过在 sces 秒之内什么都
 25         没有发生(读/写), 则会产生一个 socket.timeout 异常, 链接机会断开,
 26     例子,
 27         ... ...
 28         sock, addr = S.accept()
 29         sock.settimeout(9)
 30         ... ...
 31 
 32 结束标识,
 33     通过 socket 传输不确定长度的字符串的会遇到一个问题 - 不知道什么时候数据发送结束.
 34     通常,有两种方法可以解决这个问题,
 35         1, 通过指定字符串结束标识符(尾)
 36             这个标识符通常是一个 NULL 字符(python - '\0') 或 newline 字符(python - '\n')
 37             需要注意的问题是需要保证设定的结束符在所传输的内容中的'唯一'性.
 38         2, 通过指定字符串长度指示符(首)
 39             先发发送一个数字用来表示数据的长度, 接受方会根据这个数字长度的数据.
 40             在网络上发送整形数据的时候,通常有一下儿两种选择,
 41                 a, 发送 ASCII 码(接收方收到后需要解码)
 42                 b, 直接发送 二进制 数, 一般位长是 16 或 32 位.
 43                     为了解决不同平台的二进制数据的编码方法不同的问题, 一种标准的二进制数据
 44                     表示法 - 网络字节顺序( Network Byte Order )被采纳. 在发送一个二进制数之前,
 45                     该二进制数被转换成  Network Byte Order; 接收方收到后, 在使用该数据之前做
 46                     '反向转换'.
 47 
 48 广播数据,
 49     广播数据不能用 TCP 实现, 他多数是用 UDP 来实现的.
 50     当接受方收到一个广播信息后, 系统内核会检查目的地的端口号信息. 如果系统上有一个在 listen 监听该端口
 51     号的进程,则信息会被发送给该进程, 否者信息会被忽略掉.
 52     例子,
 53         发送方,
 54             import socket
 55             S = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)      # UDP
 56             S.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)   # 广播 broadcast
 57             S.sendto("Hi there!",('<broadcast>', 12345))              # host = '<broadcast>'
 58 
 59             while 1:
 60                 try:
 61                     data, addr = S.recvfrom(1024)
 62                     print("%s is connecting" % clientsocket.getpeername())
 63                 except (KeyboardInterrupt,SystemExit) as e:
 64                     print(e)
 65                     raise
 66                 if not len(data):
 67                     break
 68                 print("Received message : %s from : %s",(data, addr))
 69 
 70         接受方,
 71             import socket
 72 
 73             S = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)      # UDP
 74             S.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   # 链接关闭后,端口立即可用
 75             S.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)   # 广播 broadcast
 76             S.bind(('', 12345))
 77 
 78             while 1:
 79                 try:
 80                     mes, addr = S.recvfrom(8192)
 81                     print("Got message : %s from : %s" % (mes, addr))
 82                     S.sendto("ACK", addr)                             # 回复不是广播
 83                 except (KeyboardInterrupt, SystemExit) as e:
 84                     print(e)
 85                     raise
 86 
 87 通过 poll() 或 select() 实现事件通知,
 88     通常, socket 上的 I/O 是阻塞的, 当一个操作(读/写)未结束,程序会阻塞.
 89     在 nonblocking 模式中, 如果在没有完全准备好的 socket 对象调用 send() 或 recv() 方法
 90     会触发 socket.error 异常. 在这种情况下, 就需要在调用 recv() 之前检查一下儿, socket 上
 91     是不是有可以接受的 data. select() 和 poll() 就是满足检查需求的两个标准工具. 他们可以使
 92     系统在某个 socket 上有事件发生的时候通知程序发生了什么, 从而在程序中进行有针对性的操作.
 93     select() 接口是早起被普遍使用的, 但是在需要同时观察多个 socket 的事件的时候, 会变得很慢.
 94     Windows 系统不支持 poll(), 必须使用 select().
 95 
 96     例子,
 97         poll()
 98             import socket, select
 99             try:
100                 S = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
101             except socket.error as e:
102                 print("Error at creating socket : %s" % e)
103 
104             try:
105                 s.connect(("www.zzyzz.top", 80))
106             except socket.gaierror as e:
107                 print("Address related error : %s" % e)
108             except socket.error as e:
109                 print("Connection error : %s" % e)
110             P = select.poll()
111             P.register(S.fileno(), select.POLLIN | select.POLLERR | select.POLLHUP)
112                 # POLLIN        普通或优先级带数据可读
113                 # POLLERR        发生错误
114                 # POLLHUP        对方描述符挂起
115                 # POLLRDNORM    普通数据可读
116                 # POLLRDBAND    优先级带数据可读
117                 # POLLPRI        高优先级数据可读
118                 # POLLOUT        普通数据可写
119                 # POLLWRNORM    普通数据可写
120                 # POLLWRBAND    优先级带数据可写
121                 # POLLNVAL        描述字不是一个打开的文件
122 
123             while 1:
124                 res = P.poll(100)          # poll 间隔 100 毫秒
125                 if len(res):
126                     if res[0][1] == select.POLLIN:
127                         data = S.recv(1024)
128                         if not len(data):
129                             print("Connection closed")
130                             break
131                         print("Received data : %s" % data)
132                     else:
133                         print("Errors occurred")
134                         break
135 
136         select() 来解决 I/O 阻塞
137              select(rlist, wlist, elist[, timeout])
138                 rlist - '' 的文件对象列表
139                 wlist - '' 的文件对象列表
140                 elist - '错误' 的文件对象列表
141                 timeout - 可选参数, 接收浮点类型, 指明超时的时间(秒)
142 
143                 select() 方法的调用返回 3 个tuple, 每一个 tuple 都是一个对象列表, 顺序对应参数顺序.
144 
145                 import socket, select
146                 try:
147                     S = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
148                 except socket.error as e:
149                     print("Error at creating socket : %s" % e)
150 
151                 try:
152                     s.connect(("www.zzyzz.top", 80))
153                 except socket.gaierror as e:
154                     print("Address related error : %s" % e)
155                 except socket.error as e:
156                     print("Connection error : %s" % e)
157 
158                 while 1:
159                     infds, outfds, errfds = select.select([S],[],[S],0.05)
160                     if len(infds):
161                         data = S.recv(1024)
162                         if not len(data):
163                             print("Connection closed")
164                             break
165                         print("Received data : %s" % data)
166                     if len(errfds):
167                         print("Errors occurred")
168                         break

 

转载于:https://www.cnblogs.com/zzyzz/p/7994036.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java getattribute为空_Java TransMeta.getAttribute方法代码示例

import org.pentaho.di.trans.TransMeta; //导入方法依赖的package包/类Overridepublic void getData( TransMeta transMeta ) throws KettleException {try {String serviceName transMeta.getAttribute( StreamingConst.STREAMING_GROUP, StreamingConst.STREAMING_SERVICE_…

python summary writer_tensorflow中summary操作

tf中 tensorboard 工具通过读取在网络训练过程中保存到本地的日志文件实现数据可视化&#xff0c;日志数据保存主要用到 tf.summary 中的方法。tf.summary中summary是tf中的一个py文件&#xff0c;位置在 /tensorflow/python/summary/ 文件夹下&#xff0c;提供了像tf.summary.…

10 3 java_10.3 UiPath如何调用Java

调用Java方法(Invoke Java Method)的介绍从Java Scope中的.jar加载的方法中调用指定的Java方法。并结果存储在变量中二、Invoke Java Method 在UiPath中的使用打开设计器, 在设计库中新建一个Sequence&#xff0c;为序列命名及设置Sequence存放的路径, 在Activities中搜索Java …

物联网python教程慕课_物联网技术(校慕课资源,物联网组)-中国大学mooc-题库零氪...

3. 智慧社区的部署3.1 IIS服务器安装随堂测验1、在安装IIS信息服务器时&#xff0c;我们应打开电脑控制面板中的哪个设置( )A、管理工具B、程序与功能C、Windows 防火墙D、操作中心2、在安装IIS服务器时&#xff0c;在widows功能下需要勾选以下哪几项 &#xff1f;( )A、Intern…

台达伺服电机选型手册_机械加工工艺师手册_打包下载

如何【设为星标★】&#xff0c;优先推送资料信息&#xff1f;Ta们都在看咱们&#xff1a;机械大佬群注意及时保存和下载&#xff0c;资料若失效请拉到本页底部留言&#xff0c;我们将不定时补发&#xff01;免责声明&#xff1a;该资料系网络转载&#xff0c;版权归原作者所有…

java zar_唬人的Java泛型并不难

泛型public interfaceFoo {}public interfaceBar {}public interfaceZar> {}上面的代码有什么区别&#xff1f;泛型初探1、为何引入泛型&#xff1f;Java 泛型也是一种语法糖&#xff0c;使用泛型可以在代码编译阶段完成类型的转换&#xff0c;避免代码在运行时强制转换而出…

团队作业7——Beta版本冲刺计划及安排

需要改进的工具流程&#xff08;如版本控制、测试工具等&#xff09; 首先把之前项目的BUG进行修复 然后完成如下的功能 冲刺的时间计划安排 &#xff08;冲刺时间为期七天&#xff0c;安排在2017.12.4——2017.12.10之间&#xff09; 组员任务陈福鹏实现博客.多语言、倒计…

开发黑名单功能demo_中台实践:通用化黑名单平台

业务中台的价值主要体现在对通用化业务能力的沉淀、整合&#xff0c;通过对可复用业务流程和业务功能的设计&#xff0c;向不同业务方提供标准化且可扩展的服务能力。本文来聊一聊笔者工作过程中设计的通用化黑名单平台&#xff0c;通过将用户管控能力的下沉&#xff0c;为各业…

java注解教程 pdf_Java注解详解

在使用SpringBoot作为Web敏捷开发的框架之后&#xff0c;SpringBoot除了自动装配配置的便捷之外&#xff0c;在很多时候需要基于注解来开发。注解不仅增加了代码的可读性&#xff0c;还增加了开发的速度。这篇文章主要讲述Java 注解。元注解元注解用于注解其他注解的。Java 5.0…

●BZOJ 1855 [Scoi2010]股票交易

题链&#xff1a; http://www.lydsy.com/JudgeOnline/problem.php?id1855 题解&#xff1a; DP,单调队列优化。&#xff08;好久没做 DP题&#xff0c;居然还意外地想出来了&#xff09; 定义 dp[i][k] 表示前 i天&#xff0c;手上还有 k股的最大收益。&#xff08;注意这个定…

java无权图求最短路径_求有权图和无权图的最短路径

无权图的最短路径思路&#xff1a;无权图的最短路径也就是要求两点之间最少几跳可达&#xff0c;那么我们可以这样&#xff0c;用广度遍历&#xff0c;从起点开始一层层遍历&#xff0c;如果第一次遍历到终点&#xff0c;那么肯定是最短路径。public static void findPath(int …

无限级分类及生成json数据

第一步,先去数据库查询类别数据,然后交给生成json数据的函数处理,代码如下: 1 /*生成类别JSON数据*/ 2 public function wirteJson(){ 3 $dataInfo \think\Db::query("select id as v,name as n,pid from think_pro_category"); 4 $data $this…

python游戏图像识别_利用python做图像识别

Python验证码识别处理实例(转)一、准备工作与代码实例1、PIL、pytesser、tesseract(1)安装PIL&#xff1a;下载地址&#xff1a;http://www.pythonware.com/products/pil/(CSDN下载)下载后是一个exe&#xff0c;直接双击安装&#xff0c;它会自动安装到C:\Python27\Lib\site-pa…

Java旅游动吧项目讲解_springboot动吧项目

架构分析页面流程业务分析&#xff1a;客户端向服务端发送一个请求&#xff0c;发向了Tomcat&#xff0c;如果Tomcat只有一个线程是不可能处理多个请求的&#xff0c;所以就需要一个多个线程的池资源&#xff0c;然后线程用I/O读取请求中的数据&#xff0c;然后服务器从http协议…

java并发-内存模型与volatile

JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的。因此&#xff0c;我们首先必须了解这些概念 1&#xff0c;原子性 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开始&#xff0c;就不会被其他线程干扰&#xf…

python glob函数_python glob 模块 map函数

昨晚有了点小想法&#xff0c;想写个小脚本。用到了 glob 模块 和 map 函数 觉得他们配合起来和不错的。#coding:utf8import globprint "glob.golb 方法返回 " , glob.glob(r"/var/log/*.log")a glob.iglob(r"/var/log/*.log")print &qu…

数据分析师免费课程网址

分享一些免费的课程以下课程免费&#xff0c;讲师都是领域的专家&#xff0c;需要提前报名&#xff0c;请注意开班的时间。Coursera.org&#xff1a;统计学。Coursera.org&#xff1a;机器学习。Coursera.org&#xff1a;数据分析的计算方法。Coursera.org&#xff1a;大数据。…

微信机器人红包java_微信机器人_奇迹蛋_java实现

【实例简介】参考了别人的一些微信开发方法&#xff0c;自己实现了一个简单的微信机器人&#xff0c;部署在百度云上&#xff0c;能够点歌&#xff0c;查询天气&#xff0c;调教对话。可关注微信公众号&#xff1a;奇迹蛋。实现说明&#xff1a;http://blog.csdn.net/elcarim/a…

python增量赋值是什么意思_关于python中的增量赋值的理解

增量赋值运算符 和 * 的表现取决于它们的第一个操作对象 操作首先会尝试调用对象的 __ iadd__方法&#xff0c;如果没有该方法&#xff0c;那么尝试调用__add__方法&#xff0c;所以 与 的区别实质是__iadd__ 与 __add__的区别&#xff0c;同理&#xff0c;* 操作首先会尝试调…

Notepad++使用教程

Notepad 快捷键 大全CtrlC 复制CtrlX 剪切CtrlV 粘贴CtrlZ 撤消CtrlY 恢复CtrlA 全选CtrlF 键查找对话框启动CtrlH 查找/替换对话框CtrlD 复制并粘贴当行CtrlL 删除当前行CtrlT 当行向上移动一行F3 查找下一个ShiftF3 查找上一个CtrlShiftF 组合在文件中查找CtrlF3 查找&#x…