python3网络开发实战,python3编程 入门到实践

  python3网络开发实战,python3编程 入门到实践

  在学习python网络编程的时候,过于生硬、难以理解的知识点总是让我们需要去看看其他人在这方面的总结思路,往往用例子更容易理解。下面是网络编程最基本的内容示例。

  编写一个最简单的Client/Server程序:

  1.首先,执行以下命令打开一个监听端口8000的HTTP服务器:

  python3 -m http.server 8000

  在0.0.0.0端口8000上提供HTTP服务.

  2.然后编写一个程序向该服务器发起HTTP请求:

  导入请求

  r=requests . get( http://127 . 0 . 0 . 1:8000/)

  打印(r)3。再次执行该程序:

  bash-3.2$pythontest.py

  Response[200]显示服务器返回了200成功响应。

  现在我们来总结请求过程:

  向服务器发出HTTP(GET)请求。

  服务器向客户端返回了HTTP(200)响应。

  这是我们能看到的最抽象的过程。下面我们来仔细看看tcpdump发生了什么:

  在命令行上使用tcpdump来监视本地网卡的tcp连接。

  tcpdump-I l00端口8000

  : 微软雅黑, "Microsoft YaHei";">再通过wireshark来观察结果:

  

tcpdump-ilo0port8000-wtest.cap

现在执行程序:

  

bash-3.2$pythontest.py

  <Response[200]>

得到结果:

  

tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode

  listeningonlo0,link-typeNULL(BSDloopback),capturesize262144bytes

  23:46:06.464962IPlocalhost.49329>localhost.irdmi:Flags[S],seq1191154495,win65535,options[mss16344,nop,wscale5,nop,nop,TSval178410641ecr0,sackOK,eol],length0

  23:46:06.465018IPlocalhost.irdmi>localhost.49329:Flags[S.],seq1405387906,ack1191154496,win65535,options[mss16344,nop,wscale5,nop,nop,TSval178410641ecr178410641,sackOK,eol],length0

  23:46:06.465029IPlocalhost.49329>localhost.irdmi:Flags[.],ack1,win12759,options[nop,nop,TSval178410641ecr178410641],length0

  23:46:06.465039IPlocalhost.irdmi>localhost.49329:Flags[.],ack1,win12759,options[nop,nop,TSval178410641ecr178410641],length0

  23:46:06.465065IPlocalhost.49329>localhost.irdmi:Flags[P.],seq1:146,ack1,win12759,options[nop,nop,TSval178410641ecr178410641],length145

  23:46:06.465079IPlocalhost.irdmi>localhost.49329:Flags[.],ack146,win12754,options[nop,nop,TSval178410641ecr178410641],length0

  23:46:06.467141IPlocalhost.irdmi>localhost.49329:Flags[P.],seq1:156,ack146,win12754,options[nop,nop,TSval178410642ecr178410641],length155

  23:46:06.467171IPlocalhost.49329>localhost.irdmi:Flags[.],ack156,win12754,options[nop,nop,TSval178410643ecr178410642],length0

  23:46:06.467231IPlocalhost.irdmi>localhost.49329:Flags[P.],seq156:5324,ack146,win12754,options[nop,nop,TSval178410643ecr178410643],length5168

  23:46:06.467245IPlocalhost.49329>localhost.irdmi:Flags[.],ack5324,win12593,options[nop,nop,TSval178410643ecr178410643],length0

  23:46:06.467313IPlocalhost.irdmi>localhost.49329:Flags[F.],seq5324,ack146,win12754,options[nop,nop,TSval178410643ecr178410643],length0

  23:46:06.467331IPlocalhost.49329>localhost.irdmi:Flags[.],ack5325,win12593,options[nop,nop,TSval178410643ecr178410643],length0

  23:46:06.468442IPlocalhost.49329>localhost.irdmi:Flags[F.],seq146,ack5325,win12593,options[nop,nop,TSval178410644ecr178410643],length0

  23:46:06.468479IPlocalhost.irdmi>localhost.49329:Flags[.],ack147,win12754,options[nop,nop,TSval178410644ecr178410644],length0

通过结果可得:

  

客户端发起一个SYN报文,向服务器请求建立一个TCP连接。

  

服务器端返回一个SYN+ACK报文,表示服务器收到了客户端传来的请求,并同意与客户端建立TCP连接。

  

客户端返回一个ACK报文,表示已经知道服务器同意建立TCP连接,这时候双方开始通信。

  

客户端和服务器端不断地交换信息,接收报文,返回应答。

  

最后数据传输完毕,服务器发起一个FIN报文,表示要结束通信,客户端返回一个ACK应答,接着又发送一个FIN报文,最后服务器端返回一个ACK应答,此时连接过程结束。

  

现在再来看服务器端的状态,通过lsof命令来查看绑定8000端口的描述符信息:

  

lsof-n-i:8000

  COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAME

  python3.41128tonnie4uIPv40x17036ae156ec58cf0t0TCP*:irdmi(LISTEN)

现在用刚才的例子来解释TCP中状态迁移的概念,这时候,如果从客户端到来一个请求:

  

服务器端接收到客户端的SYN报文,返回SYN+ACK报文,服务器端进入SYN_RCVD状态。

  服务器端收到客户端返回的ACK应答后,连接建立,进入ESTABLISHED状态。

  服务器端的数据传输完毕,给客户端发送FIN报文,进入FIN_WAIT_1状态。

  服务器端接收到客户端返回的ACK应答后,进入FIN_WAIT_2状态。

  服务器端接收到客户端的FIN报文,接着返回一个ACK应答,等待连接关闭,进入TIME_WAIT状态。

  服务器端经过2MSL时间后进入CLOSED状态,此时连接关闭。

在上面的程序中,客户端与服务器端的通信都要经过四个层(应用层、传输层、网络层、网络接口层)来打交道。那么这段Python程序都是通过socket操作连接的建立和关闭以及数据的传输等一系列方法。

  

客户端最简化代码:

  

importsocket

  sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  sock.connect(('127.0.0.1',8000))

  sock.send(b'GET/HTTP/1.1\r\nHost:127.0.0.1:8000\r\n\r\n')

  data=sock.recv(4096)

  print(data)

  sock.close()

服务器端最简化代码:

  

importsocket

  sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

  sock.bind(('127.0.0.1',8000))

  sock.listen(5)

  while1:

  cli_sock,cli_addr=sock.accept()

  req=cli_sock.recv(4096)

  cli_sock.send(b'helloworld')

  cli_sock.close()

以上就是最简单的python网络编辑基础内容,大家可以消化学习,想要了解更多关于python的网络编程内容,点击进入PyThon学习网教学中心

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: