【Python Web开发】02-Socket网络编程02
文章目录
- 1. 服务器端
- 1.1 socket.socket()
- 1.2 socket.bind()
- 1.3 socket.listen()
- 1.4 socket.accept()
- 1.5 socket.recv()
- 1.6 socket.send() 和 socket.sendall()
- 1.7 socket.close()
- 2. 客户端
- 2.1 socket.socket()
- 2.2 socket.connect()
- 2.3 socket.send() 和 socket.sendall()
- 2.4 socket.recv()
- 2.5 socket.close()
- 2.6 UDP 客户端方法的差异
这里主要是介绍一下Socket通讯中服务端和客户端需要使用的方法及其说明
1. 服务器端
在 Python 网络编程里,服务器端通常会使用 socket 模块中的多个方法来实现网络通信。
下面为你详细介绍服务器端常用的方法及其用法。
1.1 socket.socket()
-
功能:创建一个套接字对象。套接字是网络编程的基础,它就像是一个通信的端点,通过它可以进行数的发送和接受
-
语法:
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
- 参数说明:
- family:指定地址族,常用的有 socket.AF_INET(表示 IPv4 地址)和 socket.AF_INET6(表示 IPv6 地址)。
- type:指定套接字类型,常用的有 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
- proto:通常取默认值 0。
- fileno:通常取默认值 None。
示例
import socket# 创建一个TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1.2 socket.bind()
-
功能:将套接字绑定到指定的IP地址和端口号。这样客户端就可以通过这个地址和端口找到服务器。
-
语法:
socket.bind(address)
-
参数说明
- address:是一个元组,格式为 (host, port),其中 host 是 IP 地址,port 是端口号。
示例:
# 服务器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)
1.3 socket.listen()
- 功能:让套接字进入监听状态,开始等待客户端的连接请求
- 语法:
socket.listen(backlog)
- 参数说明
- backlog:指定允许排队等待处理的最大连接请求数量
示例
# 开始监听,允许最多5个连接请求排队等待
server_socket.listen(5)
print('服务器正在监听端口 8888...')
1.4 socket.accept()
- 功能:接受客户端的请求,并返回一个新的套接字对象和客户端地址。新的套接字对象用于与客户端进行数据通信。
- 语法:
conn, addr = socket.accept()
- 返回值说明:
- coon:是一个新的套接字对象,用于与客户端进行数据收发。
- addr:是客户端的地址信息,通常是一个元组(host,port)
示例
while True:# 接受客户端连接connection, client_address = server_socket.accept()print(f'连接来自: {client_address}')
1.5 socket.recv()
- 功能:从客户端接收数据
- 语法:
data = socket.recv(bufsize)
- 参数说明:
- bufsize:指定一次最多接收的字节数
示例
# 接收客户端发送的数据
data = connection.recv(1024)
print(f'收到的数据: {data.decode()}')
1.6 socket.send() 和 socket.sendall()
-
功能:向客户端发送数据。send方法尝试发送数据,但可能不会发送完所有的数据;sendall方法会确保所有数据都被发送出去
-
语法:
# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
- 参数说明:
- data:要发送的数据,必须是字节类型
示例
# 发送响应给客户端
message = '你好,客户端!'
connection.sendall(message.encode())
1.7 socket.close()
- 功能:关闭套接字,释放相关资源
- 语法:
socket.close()
示例
# 关闭连接
connection.close()
完整示例
以下是一个完整的 TCP 服务器端示例代码,展示了上述方法的综合使用:
import socket# 创建一个TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 开始监听,允许最多5个连接请求排队等待
server_socket.listen(5)
print('服务器正在监听端口 8888...')while True:# 接受客户端连接connection, client_address = server_socket.accept()try:print(f'连接来自: {client_address}')# 接收客户端发送的数据data = connection.recv(1024)print(f'收到的数据: {data.decode()}')# 发送响应给客户端message = '你好,客户端!'connection.sendall(message.encode())finally:# 关闭连接connection.close()
通过上述方法的使用,可以实现一个简单的 TCP 服务器端,处理客户端的连接请求和数据通信。
如果使用 UDP 协议,部分方法会有所不同,例如不需要 listen 和 accept 方法,而是直接使用 recvfrom 和 sendto 方法进行数据的收发。
2. 客户端
在 Python 网络编程里,客户端也会用到 socket 模块中的多个方法来和服务器进行通信。
下面详细介绍客户端常用的方法及其用法。
2.1 socket.socket()
- 功能:创建一个套接字对象,这是网络通信的基础,客户端借助它来发送和接收数据。
- 语法:
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
- 参数说明:
- family:指定地址族,常见的有 socket.AF_INET(代表 IPv4 地址)和 socket.AF_INET6(代表 IPv6 地址)。
- type:指定套接字类型,常用的是 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
- proto:一般取默认值 0。
- fileno:通常取默认值 None。
示例
import socket# 创建一个TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2.2 socket.connect()
- 功能:客户端使用此方法向服务器发起连接请求。若服务器接受请求,双方就会建立起连接。
- 语法:
socket.connect(address)
- 参数说明
- address:是一个元组,格式为 (host, port),host 是服务器的 IP 地址,port 是服务器监听的端口号
示例
# 服务器地址和端口
server_address = ('localhost', 8888)
client_socket.connect(server_address)
2.3 socket.send() 和 socket.sendall()
- 功能:向服务器发送数据。send 方法尝试发送数据,但也许不会发送完所有数据;sendall 方法会保证所有数据都被发送出去。
- 语法:
# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
- 参数说明
- data:要发送的数据,必须是字节类型。
示例
# 发送数据给服务器
message = '你好,服务器!'
client_socket.sendall(message.encode())
2.4 socket.recv()
- 功能:从服务器接收数据。
- 语法:
data = socket.recv(bufsize)
- 参数说明
- bufsize:指定一次最多接收的字节数。
示例
# 接收服务器的响应
data = client_socket.recv(1024)
print(f'收到服务器的响应: {data.decode()}')
2.5 socket.close()
- 功能:关闭套接字,释放相关资源。
- 语法:
socket.close()
示例
# 关闭连接
client_socket.close()
完整示例代码
下面是一个完整的 TCP 客户端示例代码,展示了上述方法的综合运用:
import socket# 创建一个TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址和端口
server_address = ('localhost', 8888)# 连接服务器
client_socket.connect(server_address)try:# 发送数据给服务器message = '你好,服务器!'client_socket.sendall(message.encode())# 接收服务器的响应data = client_socket.recv(1024)print(f'收到服务器的响应: {data.decode()}')
finally:# 关闭连接client_socket.close()
2.6 UDP 客户端方法的差异
若使用 UDP 协议,客户端不需要 connect 方法来建立连接,而是直接使用 sendto 和 recvfrom 方法进行数据的收发。下面是一个简单的 UDP 客户端示例:
import socket# 创建一个UDP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服务器地址和端口
server_address = ('localhost', 9999)# 发送数据给服务器
message = '你好,服务器!'
client_socket.sendto(message.encode(), server_address)# 接收服务器的响应
data, server = client_socket.recvfrom(1024)
print(f'收到服务器的响应: {data.decode()}')# 关闭套接字
client_socket.close()