Python Socket 编程快速入门

Python Socket 编程


课前了解

Python 网络编程 | 菜鸟教程 (runoob.com)

TCP和UDP的最完整的区别 - 割肉机 - 博客园 (cnblogs.com)

不同的电脑上的进程之间如何通信


在一台电脑上可以通过进程号PID来标识一个唯一的进程,但是在网络中是行不通的。

其实TCP/IP协议族已经帮我们解决了这个问题﹐网络层的ip地址可以唯一标识网络中的主机﹐而传输层的“协议+端口”可以唯―标识主机中的应用进程

这样利用ip地址﹐协议﹐端口就可以标识网络的进程了﹐网络中的进程通信就可以利用这个标志与其它进程进行交互

什么是 Socket?


Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket是进程间通信的一种方式﹐它与其他进程间通信的一个主要不同是︰
它能实现不同主机间的进程间通信﹐我们网络上各种各样的服务大多都是基于Socket 来完成通信的例如我们每天浏览网页·QQ聊天·收发email 等等

UDP套接字


套接字的使用流程(好比是写信)

image-20211204140010775

服务端

  1. 创建套接字
  2. 使用套接字收/发数据
  3. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from socket import *

# 1.创建套接字
# 类socket(AF_INET,SOCK_DGRAM) 其中AF_INET表示使用IPv4地址进行通信,SOCK_DGRAM表示使用UDP协议
udp_socket = socket(AF_INET,SOCK_DGRAM)

# 2.设置接收方的地址
# dest_addr是一个元组 IP是字符串,端口是数值
dest_addr = ('127.0.0.1',6666)

# 3.创建发送数据
send_data = input("请输入要发送的数据:")

# 4.发送数据至指定的程序接口
# 类sendto() 第一个参数为发送的数据,类型为字节型;第二个参数为地址信息,值类型为元组
udp_socket.sendto(send_data.encode("utf-8"),dest_addr)

# 5.关闭套接字
udp_socket.close()

客户端

  1. 创建客户端套接字
  2. 绑定 本地信息
  3. 发送/接收数据
  4. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from socket import *

# 1.创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2.绑定本地信息,如果不绑定,则系统随机分配
local_addr = ('',8888) # ip地址和端口号,ip留空表示本机任何一个IP
udp_socket.bind(local_addr)

# 3.等待接收对方的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数

# 4.显示接收到的数据
print(recv_data[0].decode('gbk'))
print(recv_data[1])

# 5.关闭套接字
udp_socket.close()

TCP套接字


套接字的使用流程(好比是打电话)

可靠性高

image-20211204140138682

TCP通信需要经过创建连接、数据传送﹑终止连接三个步骤。

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,”打电话””

TCP客户端构建

  1. 创建socket
  2. 连接服务器
  3. 发送/接收数据
  4. 关闭socket连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from socket import *

# 1.创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 2.创建对服务端连接
tcp_client_socket.connect("",6789)

# 3. 发送数据
send_data = input("请输入要发送的数据")

tcp_client_socket.send(send_data.encode("gbk"))

# 4.接收服务端数据
recvData = tcp_client_socket.recv(1024)
print(recvData.decode("gbk"))

# 5.关闭套接字连接
tcp_client_socket.close()

TCP服务端的构建

  1. socket创建一个套接字
  2. bind绑定ip和port
  3. 使用listen令套接字变为被动连接
  4. accept等待客户端的连接
  5. recv/send接收发送数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from socket import *

# 1.创建socket
tcp_server_socket = socket(AF_INET,SOCK_STREAM)

# 2.绑定本地信息
local_bind = ('', 7892)
tcp_server_socket.bind(local_bind)

# 3.使用listen令套接字变为被动连接
tcp_server_socket.listen(128)

# 4.accept等待客户端的连接(阻塞)
new_client_socket, client_addr = tcp_server_socket.accept()
print('---连接成功---')

# 5.接收数据
recv_data = new_client_socket.recv(1024)
print(recv_data.decode("gbk"))

# 6.发送数据
new_client_socket.send("Yes,I'm OK".encode("gbk"))

# 7.关闭套接字
new_client_socket.close()
tcp_server_socket.close()