Python数据分析与可视化:实战案例解析
121
2023-10-25
【摘要】 本书摘自《零基础Python 从入门到精通》一书中第16章,第3节,编者是壹零快学。
16.3 TCP编程
前面小节介绍了socket对象的常见方法和使用步骤,socket是网络编程中一个抽象的概念。本节将会以一组TCP客户端和服务端作为例子,为读者展示实际应用中简单的socket网络编程。
16.3.1 客户端
当我们使用浏览器打开网页的时候,浏览器就是一个客户端,浏览器也会创建socket对象并主 动向所访问的网站服务器发起连接。如果一切顺利,访问的网站服务端接受了我们的连接,说明TCP连接建立起来了,之后我们就可以发送相关的内容了。
要建立一个基于TCP的socket,首先要创建相关的socket对象:
动手写16.3.1
这和前一小节介绍的socket对象一样,使用socket.socket创建socket对象,我们指定使用IPv4 (socket.AF_INET)和TCP(socket.SOCK_STREAM)。这时候我们仅仅创建了socket对象,但是还 没有建立连接。
如果要建立TCP连接,我们还必须知道服务端的地址和端口号。一般情况下HTTP使用的都是 80端口(HTTP协议是基于TCP协议的一种应用层协议)。服务端的地址可以使用域名来代替,系 统会帮我们把域名转换成IP地址。
这里以连接百度网站作为示例:
动手写16.3.2
如果建立失败,程序会抛出socket.error错误。注意connect方法需要传入一个包含网络地址和端 口号的元组。
建立连接之后就可以发送数据了,使用send方法发送数据。这里我们模拟浏览器发送一个HTTP请求。
动手写16.3.3
由于HTTP协议本身相对复杂,篇幅所限,此处就不展开讨论HTTP协议本身了。若发送完没有发生任何错误,我们就能接收数据了。
动手写16.3.4
第 16 章 网络编程
接收数据的时候调用socket对象的recv方法,需要注意的是,数据并不能一次性全部接收完。 TCP协议传递的是一种流数据,在调用recv方法的时候可以指定一次接收多少字节数据,1024代表 接收1kb的数据。当recv返回空的时候代表数据接收完毕(HTTP协议和其他TCP协议的交互过程十
分复杂,这里简化了操作,认为无返回就是接收完毕,实际要视真实网络情况而定)。
我们可以把接收到的数据保存成以“.html”为后缀的文件,并用浏览器打开查看效果。 动手写16.3.5
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("www.baidu.com", 80))
sock.send(b"GET / HTTP/1.1\r\nHOST: www.baidu.com\r\nConnection: close\r\n\r\n")
buffer = []
while True:
content = sock.recv(1024)
if content:
buffer.append(content)
else:
break
web_content = b"".join(buffer)
# 分割http协议头,保存的html文件不包含 http协议头
http_header, http_content = web_content.split(b"\r\n\r\n", 1)
with open("baidu.html", "wb") as f:
f.write(http_content)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~