python3的网络编程
下面是Python的应用及岗位。
第一部分:各个领域应用的语言。
四个重要的定位:验证算法、快速开发、测试运维、数据分析。
1、验证算法:就是对我们公司一些常见设计算法或者公式的验证,公式代码化。
2、快速开发:这个大家应该都比较熟悉,快速开发,就是用成熟框架,更少的代码来开发网站,Python在网站前后台有大量的成熟的框架,如django,flask,bottle,tornado,flask和django的使用较多,国内用Python开发的网站有:知乎、豆瓣、扇贝、腾讯、阿里巴巴;
3、测试运维:用python实现的测试工具及过程,包含服务器端、客户端、web、andriod、client端的自动化测试,自动化性能测试的执行、监控和分析,常用selenium appium等
框架。做运维同学应该清楚,在linux运维工作中日常操作涵盖了监控,部署,网络配置,日志分析,安全检测 等等许许多多的方面,无所不包。python可以写很多的脚本,把“操作”这个行为做到极致。与此同时,python在服务器管理工具上非常丰富,配置管理(saltstack) 批量执行( fabric, saltstack) 监控(Zenoss, nagios 插件) 虚拟化管理( python-libvirt) 进程管理 (supervisor) 云计算(openstack) ...... 还有大部分系统C库都有python绑定。
4、数据分析:Python有三大神器:numpy,scipy,matplotlib,其中numpy很多底层使用C语言实现的,所以速度很快,用它参加各种数学建模大赛,完全可以替代r语言和MATLAB。spark,Hadoop都开了Python的接口,所以使用Python做大数据的maprece也非常简单,加上py对数据库支持都很好,或者类似sqlalchemy的orm也非常强大好用。
在结束这个部分之前,大家有没有一个疑问:为什么爬虫没有中重点讲?
其实这里给大家重点说一下,如果你要学好Python,仅仅停留在爬虫上,这个是很不靠谱的。Python 写爬虫的教程网上一抓一大把,据大家所知很多初学 Python 的人都是使用它编写爬虫程序。小到抓取一个小黄图网站,大到一个互联网公司的商业应用。通过 Python 入门爬虫比较简单易学,不需要在一开始掌握太多太基础太底层的知识就可以很快上手,而且很快可以做出成果,非常适合小白一开始想做出点看得见的东西的成就感。
除了入门,爬虫也被广泛应用到一些需要数据的公司、平台和组织,通过抓取互联网上的公开数据,来实现一些商业价值是非常常见的做法。
当然这些选手的爬虫就要厉害的多了,需要处理包括路由、存储、分布式计算等很多问题,与小白的抓黄图小程序,复杂度差了很多倍。
2. 想要学习python网络编程,该怎样入手
网络是说 networking 还是 web?
Networking:
Unix Network Programming,TCP/IP Illustrated
至少看完第一本 80%+ 第二部卷 1 50% ,看的时候把所有代码用 Python 写过来,否则就不用想别的事情。
Web:
基本看过 RFC2616,然后挑一个框架(例如:Flask 或 Django),直接看 Tutorial。当然做 web 还要学大量的其它东西,如 HTML / CSS / JavaScript / Database 等。
问题补充的部分,简单说说:
利
用账号密码自动登陆网站、自动填表什么的,需要的是 HTTP(RFC 2616)和 web (如表单处理等)相关知识,可能需要或不需要
socket 知识,但是了解更好。制作曲线图之类需要的是 matplotlib 等数据制图工具的知识,Email 有 smtplib
之类的库可以解决,”每天定时“依靠 cron 或系统计划任务。做这种事情所需的知识面基本是很广的,但深度要求不高。
3. Python网络编程 -- TCP/IP
首先放出一个 TCP/IP 的程序,这里是单线程服务器与客户端,在多线程一节会放上多线程的TCP/IP服务程序冲戚拍。
这里将服务端和客户端放到同一个程序当中,方便对比服务端与客户端的不同。
TCP/IP是因特网的通信协议,其参考OSI模型,也采用了分层的方式,对每一层制定了相应的标准。
网际协议(IP)是为全世界通过互联网连接的计算机赋予统一地址系统的机制,它使得数据包能够从互联网的一端发送至另一端,如 130.207.244.244,为了便于记忆,常用主机名代替IP地址,例如 .com。
UDP (User Datagram Protocol,用户数据报协议) 解决了上述第一个问题,通过端口号来实现了多路复用(用不同的端口区分不同的应用程序)但是使用UDP协议的网络程序需要自己处理丢包、重包和包的乱序问题。
TCP (Transmission Control Protocol,传输控制协议) 解决了上述两个问题,同样使用端口号实现了复用。
TCP 实现可靠连接的方法:
socket通信模型及 TCP 通信过程如下两张图。
[图片上传失败...(image-6d947d-1610703914730)]
[图片上传失败...(image-30b472-1610703914730)]
socket.getaddrinfo(host, port, family, socktype, proto, flags)
返回: [(family, socktype, proto, cannonname, sockaddr), ] 由元组组成的列表散羡。
family:表示socket使用的协议簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。
socktype: socket 的类型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3
proto: 协议, 套接字所用的协议,如果不指定, 则为 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17
flags:标记,限制返回内容。 AI_ADDRCONFIG 把计算机无法连接的所有地址都过滤掉(如果一个机构既有IPv4,又有IPv6,而主机只有IPv4,则会把 IPv6过滤掉)
AI _V4MAPPED, 如果本机只有IPv6,服务却只有IPv4,这个标记会将 IPv4地址重新编码为可实际使用的IPv6地址。
AI_CANONNAME,返回规范主机名:cannonname。
getaddrinfo(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)
getaddrinfo('ftp.kernel.org', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)
利用已经通信的套接字名提供给getaddrinfo
mysock = server_sock.accept()
addr, port = mysock.getpeername()
getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)
TCP 数据发送模式:
由于 TCP 是发送流式数据,并且会自动分割发送的数据包,而仔槐且在 recv 的时候会阻塞进程,直到接收到数据为止,因此会出现死锁现象,及通信双方都在等待接收数据导致无法响应,或者都在发送数据导致缓存区溢出。所以就有了封帧(framing)的问题,即如何分割消息,使得接收方能够识别消息的开始与结束。
关于封帧,需要考虑的问题是, 接收方何时最终停止调用recv才是安全的?整个消息或数据何时才能完整无缺的传达?何时才能将接收到的消息作为一个整体来解析或处理。
适用UDP的场景:
由于TCP每次连接与断开都需要有三次握手,若有大量连接,则会产生大量的开销,在客户端与服务器之间不存在长时间连接的情况下,适用UDP更为合适,尤其是客户端太多的时候。
第二种情况: 当丢包现象发生时,如果应用程序有比简单地重传数据聪明得多的方法的话,那么就不适用TCP了。例如,如果正在进行音频通话,如果有1s的数据由于丢包而丢失了,那么只是简单地不断重新发送这1s的数据直至其成功传达是无济于事的。反之,客户端应该从传达的数据包中任意选择一些组合成一段音频(为了解决这一问题,一个智能的音频协议会用前一段音频的高度压缩版本作为数据包的开始部分,同样将其后继音频压缩,作为数据包的结束部分),然后继续进行后续操作,就好像没有发生丢包一样。如果使用TCP,那么这是不可能的,因为TCP会固执地重传丢失的信息,即使这些信息早已过时无用也不例外。UDP数据报通常是互联网实时多媒体流的基础。
参考资料:
4. Python 网络编程需要学习哪些网络相关的知识
我和你一样,也是正在学Python编程的,首先得先把C基础学会,我现在也正在学C,看视频学的,我现在看的是夏老师的,感觉还行,最吸引我的的地方就是讲的一听就能听懂,而且不繁琐啰嗦,简明清晰,都是重点。之前看过郝斌金文什么的,康辉的也看了一点,感觉都讲的太高深了,而且听不出哪些是重点,有用没用的都讲,像我这样初学者都看的失去学的信心了。
5. python中 r'', b'', u'', f'' 的含义
1、字符串前+u,如u"我是张三":
前缀u表示该字符串是unicode编码,在Python2中常被用在中文字符的字符串前,防止因为编码问题所导致的乱码,一般在文件开头标明编码方式采用utf8。在Python3中,所有的字符串默认都是unicode字符串。
2、旦者字符串前+r,如r" ":
表示一个正常的字符串,通常 被用作换行,而+r后,即表示 ,说白了就是去掉反斜杠的转义机制,在普通字符串中,反斜线是转义符,裤者代表一些特殊的内容,常用胡迟薯于特殊的字符,如换行符、正则表达式、文件路径。注意不能在原始字符串结尾输入反斜线,否则Python不知道这是一个字符还是换行符(字符串最后用表示换行),会报错。
3、字符串前+b,如abc=b'Zhangsan':
b' ':表示这是一个bytes对象,用在Python3中,它默认的str是unicode类,Python2的str本身就是bytes类。
b" ":表示后面字符串是bytes类型。
前缀b表示该字符串是bytes类型,常用在网络编程,服务器和浏览器只认bytes类型的数据,如send函数的参数和recv的函数的返回值都是bytes类型。
4、字符串前+f:
Python3.6的新加特性,前缀f用来格式化字符串,可以看出f前缀可以更方便地格式化字符串,比format()方法的可读性更高,且使用较方便,在加上f前缀后,支持在大括号内,运行Python表达式,也可以用fr前缀用来表示原生字符串。
6. Python网络编程9-实现TCP三次握手与四次挥手
见TCP流量分析祥烂塌篇
TCP 流量分析 - (jianshu.com)
使用一台windows主机作为TCP Server,使用一台Linux作为TCP Client,发起TCP连接,发送数据,结束连接。
以下Python脚本通过Socket实现TCP Server端,谨圆接收TCP连接。
以下Python脚本通过历乱Scapy实现TCP Client端,向Server端发起TCP连接。
首先在Windows主机上运行TCP Server脚本。
在linux主机上运行TCP Client脚本后,会将TCP交互过程打印出来。
通过科来的csna抓包,并追踪TCP流,如下为交互的数据包