网络编程

网络编程的一些基本知识

- 网络:
- 网络协议:
- 网络模型:
- IP地址
- 端口:
- 本地使用:
- 网络使用:
- 主机:
- 域名:
- 获取IP地址、计算机名:
- 传输层协议:
- TCP/IP协议:
- TCP协议:
- UDP协议:

套接字编程

socket模块

	- socket() 函数:
		- 作用:创建套接字对象。
		- 格式:socket([family[,type[,poroto]]]) 

		- 参数:
			* family:
				AF_INET:
					这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址
				AF_INET6: 
					与上面类似,不过是来用IPv6的地址
				AF_UNIX: 
					本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器在同一台及其上的时候使用

			* type:
				SOCK_STREAM: 
					这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。
					这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
				SOCK_DGRAM: 
					这个协议是无连接的、固定长度的传输调用。该协议是不可靠的
                    使用UDP来进行它的连接。
				SOCK_SEQPACKET
					该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。
                    必须把这个包完整的接受才能进行读取。
				SOCK_RAW: 
					socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
				SOCK_RDM: 
					这个类型是很少使用的,在大部分的操作系统上没有实现,
                    它是提供给数据链路层使用,不保证数据包的顺序

	        * proto:
	        	选择子协议类型 通常为0。 传0 表示使用默认协议。

	    - 返回值:
			* 成功:返回指向新创建的socket的文件描述符
			* 失败:返回-1,设置errno

	- bind()函数:
		- 作用:
            将一个套接字文件描述符与一个本地地址绑定在一起,
            即把发送数据的端口地址和IP地址进行了指定。(针对服务端)

		- 格式:
            int bind(sockfd, addr[, addrlen])
			* sockfd:     套接字描述符
			* addr:       地址信息,要绑定的地址信息   构造出IP地址加端口号
			* addrlen:    地址信息长度

		- 返回值    
			* 成功    0
            * 失败    -1

        - 常见使用:bind(addr)  绑定地址,参数addr是元组,(ip,port)

    - listen()函数:
    	- 作用:
            将套接字设置为监听套接字,等待客户端连接(针对服务端)
    	- 格式:
            listen(int sockfd, int backlog);
    		* sockfd:socket文件描述符
    		* backlog:排队建立3次握手队列和刚刚建立3次握手队列的链接数和

    	- 返回值:
    		* 成功返回0
    		* 失败返回-1
    	- 常用:lisent(backlog):开始监听,等待客户端连接

    - connect()函数:
    	- 作用:指定套接字上建立连接。(针对客户端)
		- 格式:connect(address)
			* 参数address是元组,服务端地址
			* 元组为:(ip, port),和服务端被绑定的地址和端口一致

    - accept()函数:
    	- 作用:响应客户端请求,接受连接。
    	- 格式:connfd,addr = accept()
    	- 返回值:
    		* 成功返回一个新的socket文件描述符,用于和客户端通信
    			- connfd:客户端连接套接字
                - addr:连接客户端的地址
    		* 失败返回-1,设置errno

    - send()函数:
    	- 作用: 用来在TCP套接字上发送数据。
    		    只能对处于连接状态的套接字使用.(accept后)
    	- 格式:send(bytes[, flags])
    		* 发生内容必须是bytes格式

    	- 注意:执行成功只是说明数据写入套接字的缓冲区,
    			并不代表数据已经通过网络发送到目的地。

    - sendto()函数:
    	- 作用:用来在UDP套接字上发送数据。

    	- 格式:sendto(string, address)
            * 把string中的指定内容发送给address指定的地址
            	* string就是之要发送的数据
            * address是一个包含接收方主机IP地址和应用进程端口号的元组
            	* 格式为(IP地址,端口号)
        - 返回值:发送的字节数

    - recv()函数:
    	- 作用:用来在TCP套接字上接收数据 
    	       从面向连接的套接字上接收数据并保存到指定的缓存区

    	- 格式:recv(bufsize[,flags])
    		* bufsize:接收到的最多的字节大小
    		* flags

    	- 返回值:接受的数据,格式是bytes

    - recvfrom()函数:
    	- 作用:用来在UDP套接字上接受数据

    	- 格式:recvfrom(bufsize[,flags])

    	- 返回值:返回一个元组(data,addr)
    		- data:接受的数据,格式是bytes
    		- addr:消息发送端地址 

    - setsockopt()函数:
        - 作用: 获取或者设置与某个套接字关联的选项

        - 格式:setsockopt(level,option[,value])
            * level:选项类别,可以取三种值:
                1)SOL_SOCKET:   通用套接字选项.
                2)IPPROTO_IP:   IP选项.
                3)IPPROTO_TCP:  TCP选项. 

            * option:具体选项:
                选项名称:             选项内容:                数据类型:

                ==========================SOL_SOCKET============================                
                SO_BROADCAST       允许发送广播数据       int
                SO_DEBUG         允许调试            int
                SO_DONTROUTE       不查找路由           int
                SO_ERROR         获得套接字错误         int
                SO_KEEPALIVE      保持连接           int
                SO_LINGER        延迟关闭连接         struct linger
                SO_OOBINLINE      带外数据放入正常数据流    int
                SO_RCVBUF        接收缓冲区大小        int
                SO_SNDBUF        发送缓冲区大小        int
                SO_RCVLOWAT       接收缓冲区下限        int
                SO_SNDLOWAT       发送缓冲区下限        int
                SO_RCVTIMEO       接收超时           struct timeval
                SO_SNDTIMEO       发送超时           struct timeval
                SO_REUSERADDR     允许重用本地地址和端口     int
                SO_TYPE         获得套接字类型         int
                SO_BSDCOMPAT      与BSD系统兼容         int

                ===========================IPPROTO_IP============================
                IP_HDRINCL       在数据包中包含IP首部     int
                IP_OPTINOS       IP首部选项          int
                IP_TOS         服务类型
                IP_TTL         生存时间           int

                ============================IPPRO_TCP============================

                TCP_MAXSEG       TCP最大数据段的大小      int
                TCP_NODELAY       不使用Nagle算法        int

            * value:选项值:一般默认为1

    - getsockname()函数
        - 作用:函数获取套接字的绑定地址
        - 返回值:返回绑定地址

    - fileno()函数:
        - 作用:获取套接字的文件描述符
        - 返回值:返回文件描述符

UDP

    - 服务端流程:
    - 1.创建数据报套接字
        socket(AF_INET,SOCK_DGRAM)
    - 2.绑定地址
        bind(addr)
    - 3.消息的收发
        recvfrom(buffersize)   
        返回值为:接受的数据和消息发送端的地址
        sendto(data,,addr)
    - 4.关闭套接字
        close()

    - 客户端流程:
	- 1.创建数据报套接字
        socket(AF_INET,SOCK_DGRAM)
    - 2.消息的收发
        recvfrom()\sendto()
    - 3.关闭套接字
        close()

    - 案例UDP文件夹 

TCP

    - Server端流程
        - socket()-->bind()-->listen()-->accept()
          -->recv/send()--->close()
    - Client端流程
        - socket()-->connect()-->send/recv-->close()

    - 案例TCP文件夹

本地套接字

- 本地套接字
    linux文件:
        bcd-lsp
        b:块设备文件
        c:字符设备文件
        d:目录
        -:普通文件
        l:链接
        s:套接字
        p:管道
- 作用:用于本地不同的程序间进行通信
- 创建流程
    - 1.创建本地套接字
        sockfd = sockeet(AF_UNIX,SOCK_STREAM)

    - 2.绑定本地套接字文件
        选定文件位置和名称
        sockefd.bind(path)

    - 3.监听  listen()

    - 4.消息收发, recv  send  

    cookie
        os.path.exists(path)
        功能:判断一个文件是否存在
        参数:目标文件
        返回值:存在返回True,不存在返回False

        so.remove()    os.
- 案例 本地套接字 文件夹

TCP与http服务相关

- http协议
    - 用途:
        - 超文本传输协议,应用层协议
        - 网页数据的传输,数据传输的方式
    - 特点:
        - 无状态的协议,即不吉利用户传输的信息
        - 适合多种语言
        - 应用层协议,传输层使用tcp协议
        - 支持持久连接,http1.1

    - http请求
            - 格式:
                - 请求行:具体的请求类别和请求内容
                    格式: GET                         /           HTTP/1.1
                        请求类别:                   请求内容      协议版本
                        GET        获取网络资源
                        POST       提交一定的附加信息,
                                       得到返回结果
                        HEADER     获取响应头
                        PUT        更新服务器资源
                        DELETE     删除服务器资源
                        CONNECT
                        TRACE      用于测试
                        OPTIONS    获取服务器性能信息

                - 请求头:对请求内容的具体描述信息

                - 空行

                - 请求体:请求参数或者提交内容

    - http响应
        - 格式:
        - 响应行:反馈响应的情况
            格式: 协议版本    响应码                 附加信息
                   HTTP/1.1    200                      OK
                            1xx:提示信息表示请求成功
                            2xx:响应成功
                            3xx:响应需要重定向
                            4xx:客户端错误
                            5xx:服务端错误
                常见响应码:
                    200  成功
                    404  请求内容不存在
                    401  没有访问权限
                    500  服务器发生未知错误
                    503  暂时无法执行
            - 响应头:
            - 空行
            - 响应体:返回给请求端的具体内容
                - 简单案例请看ubuntu的 http_test.py
                - HTTPServer 请看案例http_sever

- 案例 查看 httpserver 文件夹

阻塞与非阻塞

- 阻塞IO:
    - 阻塞IO是IO的默认形态,是效率较低的一种IO情况。
    - 情况:
        - 某种条件没有达成
            accept   input  recv
        - 处理IO数据传输较长形成的阻塞
            网络传输过程、文件读写过程
- 非阻塞IO
    - 通过修改IO事件的属性,使其变为非阻塞
    - s.setblocking(False)
    - 案例:block_server.py

IO多路复用

- 处理流程:
    - 将IO设置为关注IO
    - 将关注IO提交给内核检测
    - 处理内核交给我们反馈的准备就绪的IO

-方案:
    - select --->window、 linux、 unix
    - poll --->linux 、 unix
    - epoll ---> linux、 unix
- select模块: 
    - 使用dir(select)查看

- select
    - 监控IO事件,阻塞等待IO事件发生
    - 案例 IO多用/select_server.py

- poll
    - 1.创建poll对象
        p = select.poll()

    - 2.添加注册事件
        p.register(s)
        - POLLIN    POLLOUT     POLLERR     POLLHUP     POLLNVAL
          rlist     wlist        xlist      断开         无效数据

    - p.unregister(s)从关注事件中移除

    - 3.阻塞等待IO发生
        event = p.poll()
        功能:阻塞等待IO发生
        返回值:events是一个列表,
                列表中给每一个元素都是一个元组,代表一个发生的IO事件
        列表内容:[(fileno,              event       ),(),(),(),.....]
                  就绪IO的文件描述符    具体就绪事件
                     (唯一)
        * 需要通过文件描述符(fileno)找到对应IO对象
            采用字典 {s.fileno() : s}

    - 案例 IO多用/poll_server.py

- epool方法
    - 基本与poll方法相同
    - 将生产对象poll()改为epoll对象事件
    - 案例 IO多用/epoll_server.py

mail编程

- 电子邮件的历史
    - 起源
    - 1969 Leonard K ,教授发给同事的"LO"
    - 1971 美国国防部
    - 通讯地址里用@
    - 1978年中国的第一份电阻邮件
    
    - 管理程序
    - Euroda使邮件普及
    - Netscape, outlook, forcmail后来居上
    - Hotmail使用浏览器发送邮件
    - 参考资料
        - [官网](https://docs.python.org/3/library/email.mime.html)    
   
- 邮件工作流程
    - MUA邮件用户代理
    - MTA邮件传输代理
    - MDA邮件投递代理

    - 编写程序
        - 发送  SMTP协议
        - 接受  PoP3 and IMAP 协议
    
    - 准备工作
    - 注册邮箱 
    - 第三方邮箱需要特殊设置
        - 进入中心设置
        - 取得授权码   
       
- PYTHON for mail :
    - SMTP协议负责发送邮件
        - 使用email模块构建邮件
            - 纯文本邮件
            - 案例 mail/07.py            

        - HTML格式邮件发送
            - 准备HTML代码作为内容
            - 吧邮件的subtype设为html
            - 发送
            - 案例 mail/08.py
            
        - 发送带附件的邮件
            - 可以吧邮件看成是一个文本邮件和一个附件的合体
            - 一封陕如果涉及多个部分,需要使用MIMEM ultipar格式构建
            - 添加一个MIMEText正文
            - 天机一个MIMEBase或者MEMIText作为附件
            - 案例 mail/09.py
            
        - 添加邮件投,抄送等信息
            - mail["From"]表示发送的信息,包括姓名和邮件
            - mail["to"]表示接受者信息,包括姓名和邮件
            - mail["Subject"]表示摘要或者主题信息
            - 案例百度

        - 同时支持html和text 格式
            - 构建一个MIMEMultipar格时邮件
            - MIMEMultipar的subtype设置成alternative格式
            - 添加HTML和text邮件
            - 案例百度
        - 使用smtplib模块发送邮件
        
    - POP3协议接受邮件    
posted @ 2021-11-16 13:33  xiaoou7  阅读(59)  评论(0编辑  收藏  举报