ad

《零基础Python 从入门到精通》_让你学得轻松_16.3 TCP编程

admin 121 2023-10-25

【摘要】 本书摘自《零基础Python 从入门到精通》一书中第16章,第3节,编者是壹零快学。

16.3 TCP编程

前面小节介绍了socket对象的常见方法和使用步骤,socket是网络编程中一个抽象的概念。本节将会以一组TCP客户端和服务端作为例子,为读者展示实际应用中简单的socket网络编程。

《零基础Python 从入门到精通》_让你学得轻松_16.3 TCP编程

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小时内删除侵权内容。

上一篇:《给所有人的Python》_第四版_也是给你的一本知识宝典_1.5.6 保存 Notebook
下一篇:打开《Java语言程序设计与应用》_从基础向熟练进发_3.1 数组的概念
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×