翼度科技»论坛 编程开发 python 查看内容

Python中常用网络编程模块

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一、网络基础

网络由下往上分为:物理层、数据链路层、网络怪、传输层、会话层、表示层和应用层。
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输;socket则是对TCP/IP协议的封装,它本身不是协议,而是一个调用接口;
HTTP、FTP是应用协议,主要解决如何包装数据;
TCP连接的三次握手:

  • 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
利用Socket建立网络连接的步骤(一对套接字连接过程):
1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
  为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
TCP和UDP的区别:

  • TCP是面向连接的,连接经过了三次握手,很大程度的保证了连接的可靠性;
    -UDP传送数据前并不与对方建立连接,对收到的数据也不发送触诊信号,因此UDP的开销更小,数据传输速率更高。QQ是就采用的UPD协议传输,而相似的MSN采用的是TCP协议传输。
二、socket模块

网络服务都是建立在socket基础之上的,socket是网络连接端点,是网络的基础;每个socket都被绑定到指定的IP和端口上;
1、首先使用socket(family=AF_INET,type=SOCK_STREAM,proto)函数创建一个对象;
family地址参数,还可以有AF_INET6,AF_UNIX;typesocket类型;proto协议类型,可选参数创建成功后用bind('127.0.0.1',1051)绑定ip地址和端口,如果地址为空则表示本机;
2、socket对象方法:
  1. bind('127.0.0.1',1051)    绑定ip地址和端口,如果地址为空则表示本机;
  2.     listen(backlog)          监听所有socket对象创建的连接,backlog指定连接队列数,最小为1,最大一般为5;
  3.     connect(address)
  4.     connect_ex(address)      两个都可以连接到服务端,不同的是第一个返回一个错误,第二个返回一个异常;
  5.     accept()              接收来自客户端的数据,返回一个新的socket对象和客户端地址;
  6.     recv(bufsize,flags)      仅返回所接收的字符串;bufsize指定接收缓冲区的大小,flags为可选参数,表示接收标志;
  7.     recvfrom(bufsize,flags)    返回所接收的字符串和地址;
  8.     send(string,flags)       向已经连接的socket发送数据;
  9.     sendall(string,flags)      与send不同的是将会一直发送完全部数据;
  10.     sendto(string,flags,address)可以向一个未连接的socket发送数据;
  11.     makefile(mode,bufsize)     将socket关联到文件对象上,两个参数都是可选的,mode文件模式,bufsize缓冲区大小;
  12.     close()                 完成通信后,应使用close方法关闭网络连接;
复制代码
服务器端实例
  1. import socket
  2. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3. sock.bind('127.0.0.1',20178)
  4. sock.listen(5)
  5. conn,address = sock.accept()
  6. print('connect by ',address)
  7. while True:
  8.     data = conn.recv(100)
  9.     if not data:break
  10.     print(data)
  11.     conn.send("anydata")
  12. sock.close()
复制代码
客户端实例
  1. import socket
  2. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #与服务端相同
  3. sock.connect('127.0.0.1',20178)
  4. sock.send("data")
  5. data = sock.recv(98)
  6. print('recieved ',data)
  7. sock.close()
复制代码
可用select模块来实现多个并发的交互
  1. # 服务端实例
  2. import socket
  3. import select
  4. import queue
  5. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6. sock.setblocking(False)   #设置为非阻塞服务
  7. sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  8. sock.bind('127.0.0.1',20178)
  9. sock.listen(10)
  10. rlists = [sock]
  11. wlists = []
  12. msg_que = {}
  13. timeout = 20
  14. while rlists:
  15.     rs,ws,es = select.select(rlists,wlists,rlists,timeout)
  16.     if not (rs or ws or es):
  17.         print('timeout...')
  18.         break
  19.     for s in rs:
  20.         if s is sock:
  21.             conn,address = s.accept()
  22.             conn.setblocking(False)
  23.             rlists.append(conn)
  24.             msg_que[conn] = queue.Queue()
  25.         else:
  26.             data = s.recv(1024)
  27.             if data:
  28.                 print(data)
  29.                 msg_que[s].put(data)
  30.                 if s not in wlists:
  31.                     wlists.append(s)
  32.             else:
  33.                 if s in wlists:
  34.                     wlists.remove(s)
  35.                 rlists.remove(s)
  36.                 s.close()
  37.                 del msg_que[s]
  38.     for s in ws:
  39.         try:
  40.             msg = msg_que[s].get_nowait()
  41.         except queue.Empty:
  42.             wlists.remove(s)
  43.     for s in es:
  44.         print('except ',s.getpeername())
  45.         if s in rlists:
  46.             rlists.remove(s)
  47.         if s in wlists:
  48.             wlists.remove(s)
  49.         s.close()
  50.         del msg_que[s]
复制代码
三、httplib模块

httplib模块内提供了HTTPConnection对象和HTTPRresponse对象;
当创建一个HTTPConnection对象时可用方法有:
1、request(method,url,body,headers)     向服务器发送请求;

  • method  方法,有"GET","POST"等待连接
  • body       发送的数据
  • headers  发送的HTTP头
2、getresponse() 返回一个HTTPResponse对象;
3、close()            关闭与服务器的连接;
4、send(data)     发送数据;
5、putrequest(request,selector,skip_host,skip_accep_encoding) 向服务器发送请求;

  • request          所发送的操作;
  • selector          进行操作的URL;
  • skip_host       若为True则禁止自动发送"POST";
  • skip_accep_encoding 若为True则禁止自动发送"Accept-Encoding:headers"
6、putheader(headers,argument,...)

  • headers         发送的HTTP头;
  • argument      发送的参数;
7、endheaders()
HTTPResponse   对象方法:
 1、read()                   获得服务器的响应主体;
 2、getheader(name,default)  获取服务器响应的HTTP头;
 3、version()               查看HTTP协议的版本;
 4、status()                 查看HTTP协议的状态;
 5、reason()
四、ftp模块

1、FTP(host,user,passwd,acct)  创建一个FTP连接对象,此对象的方法有:
  1. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  2. FTP(host,user,passwd,acct)    创建一个FTP连接对象
  3.     getwelcome()             获得FTP服务器的欢迎信息
  4.     abort()                   中断文件传输
  5.     sendcmd(command)          发送命令,command为一个字符串
  6.     voidcmd(command)          发送命令,但没有返回值
  7.     retrbinary(command,callback,maxblocksize,rest) 下载文件(二进制)
  8.         command            由"RETR 文件名  组成"
  9.         callback          回调函数
  10.         maxblocksize      每次传输最大字节数
  11.         rest              文件续传位置
  12.     retrlines(command,callback)下载文件(ASCII)
  13.     storbinary(command,file,blocksize)    以二进制上传文件;
  14.     storlines(command,file)    以ASCII形式上传文件;
  15.     dir()                   获取当前目录的内容列表;
  16.     rename(fromname,toname)    重命名
  17.     delete(filename)        删除文件
  18.     cwd(pathname)            改变当前目录
  19.     mkd(pathname)            创建目录
  20.     rmd(dirname)            删除服务器上的目录
  21.     size(filename)           获取文件大小
  22.     set_pasv(boolean)        设置传输模式
  23.     quit()               
  24.     close()                  关闭服务器的连接
  25. set_debuglevel(level)         设置调试级别
  26. connect(host,port)            配置host
  27. login(user,passwd,acct)       登录
复制代码
附:可使用poplib模块和smtplib模块收发邮件

来源:https://www.cnblogs.com/Pythonmiss/p/18082913
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具