分享

Python的互联网编程

 小帅b 2021-10-12

 你怎么还在用Python写的单机版程序?

因为我现在才刚学不久

 现在开发的基本上都是互联网程序了,你要不要跟我一起学一下用Python网络编程?

哇!真的吗?大佬求带!

 低调低调,说到网络编程,那么我们先要了解互联网。

我了解,互联网就是把许多网络连接起来。

 恩,不错,那你知道什么是TCP,UDP吗?

em,以前听过,现在有点忘了,你可以给我说道说道吗?

 可以,我们以前的计算机网络,为了能够互相通信,很多厂商都有自己的一套协议,这就弄得很乱,因为互不兼容,所以通信起来很费劲。后来呢,为了让成千上万的计算机连接起来,定义了两个标准的协议,一个是TCP,一个是 IP,也就是我们现在简称的 TCP/IP 协议。

也就是说我们遵循 TCP/IP 协议就可以互联了是吧!

 恩,通信的时候,双方要知道对方的标识,才能通信。

那。。大佬能告诉我下 TCP 和 IP 的区别吗?

 当然可以,那我先告诉你 IP 协议吧,假如我要发信息给你,我们都在互联网上,都有自己的 IP 地址和路由,那么当我发信息给你的时候呢,IP 协议就负责将数据进行传输,这些数据被分割成一小块一小块的,通过 IP 包给发送过去。因为们之间在互联网上是有很多链路的,所以路由就会将一小块一小块的数据包逐个进行转发,直到发送到你的IP地址。但是它不能够保证数据都能到达,也保证不了能够按顺序的到达。

啊~那如果丢失怎么办?有什么办法吗?

 有!那就是 TCP 协议,TCP协议建立在IP协议之上的。TCP协议会建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,确保对方按顺序收到,如果包丢掉了,就自动的重新再发。

哦,明白了,那刚刚你说的 UDP 又是?

 我们已经知道了 TCP 是面向连接的,比较可靠,而UDP协议呢,它是面向无连接的,也就是我只要知道你的IP地址和端口就可以直接给你发送数据了,不需要先跟你握手,不过数据能不能到达就不知道了。

哦,明白,就是TCP可靠,UDP传输效率高。

 对头,所以呢,如果不要求数据可靠到达的话就可以用UDP。那么接下来我们就用 Python 来进行 TCP 和 UDP 的编程吧。

太好了!!

 不过在此之前跟你讲一下 Socket 的东西,因为等下我们要用到,Socket 在互联网编程中表示建立了一个互联网连接,Socket知道了对方的IP地址、端口号、协议,就可以建立连接了。

恩,感谢大佬,明白了。

 ok,那我们开始吧!

1 Python 中的 TCP 编程

1.1 TCP客户端的编写

我们现在访问一些网页什么的,这些网页是在服务器端的,而我们访问的设备属于客户端。

比如我们现在通过浏览器访问这个地址:

http://www./

那么会得到好多小姐姐的图片哈哈:

那么我们怎么通过 Python 来建立可靠的 TCP 连接,获取到这些图片呢?

# 导入socket这个库
import socket

# 创建一个socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 开始建立TCP连接
s.connect(("www.",80))
# 连接后,发送请求
s.send(b'GET / HTTP/1.1\r\nHost: www.\r\nConnection: close\r\n\r\n')
# 接收数据
buffer = []
while True:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
# 把字节连接起来
data = b''.join(buffer)

# 关闭连接
s.close()

# 把数据读取出来

with open('meizi.html','wb') as f:
f.write(data)


运行之后,我么就有了咱们的妹纸文件:

打开有惊喜。

 这就是建立TCP连接,然后客户端向服务端发送请求的过程了。

嗯嗯嗯,我懂了,我这就去试试,小姐姐等我。

 瞧把你急的,服务端怎么写不了解一下?

要啊,见笑见笑,我把纸巾收回去先。

1.2 TCP 服务端的编写

服务端一般都是一直在运行着的,等待着客户端来连接,然后给出请求响应,服务端需要提供 ip 地址和端口给客户端去连接。

首先我们来写一个简单服务端的:

import socket

# 创建socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 绑定监听端口
s.bind(('127.0.0.1',8888))

# 监听
s.listen(1)

while True:
# 接收连接
  sock,addr = s.accept()
print("有人连进来了")
sock.send(b'hei man, are you ok?')
sock.close

当有人连接进来我们就给他发一句:hei man,are you ok ?

接着我们再来写个客户端的连接过去:

# 导入socket这个库
import socket

# 创建一个socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 开始建立TCP连接
s.connect(("127.0.0.1",8888))
# 接收数据
buffer = []
d = s.recv(1024)
buffer.append(d)

# 把字节连接起来
data = b''.join(buffer)
print(data)

# 关闭连接
s.close()

然后先运行我们的服务端,再运行客户端:

 这就是TCP了,这里我就模拟自己一个人来连接,如果多个连接就要开启多个线程,懂了么?

懂了懂了,谢谢大佬,给~

 肥皂就不必了,我是直男。

不好意思,我刚刚拿错了,对了,大佬,那我怎么使用Python来编写UDP协议的呢?

 你已经知道了 TCP ,那么 UDP 也差不多的,不过UDP更简单一些,它不需要建立可靠的连接,直接请求就可以了,我写个代码给你看看吧。

2 Python中的 UDP 编程

我们来先写服务端:

import socket

# 创建socket对象,这里传入的是SOCK_DGRAM,代表UDP
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 绑定监听端口
s.bind(('127.0.0.1',8090))

while True:
# 接收连接
  data,addr = s.recvfrom(1024)
print(addr)
s.sendto(b'hei man, are you ok?',addr)

可以看到,在这里我们不需要跟对方连接,只要知道地址就直接发送过去就可以了。

客户端:

import socket

# 创建一个socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.sendto(b'ha',("127.0.0.1",8090))
# 接收数据
print(s.recv(1024).decode('utf-8'))

# 关闭连接
s.close()

运行如下:

 这就是UDP。

感谢大佬,我去试一下

 恩,去吧,少看点妹纸图。

关注我,让你像看小黄文一样轻松学到 Python 的所有!

长按识别

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多