Python中常用网络编程模块

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

一、网络根本

网络由下往上分为:物理层、数据链路层、网络怪、传输层、会话层、表示层和应用层。
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","OST"等候连接
  • 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则禁止自动发送"OST";
  • 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模块收发邮件

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表