Python Socket编程完全指南:服务器与客户端实战案例详解
大家好!在我们之前的教程中,我们讨论了Python的unittest模块。今天我们将介绍Python的socket编程示例。我们将创建Python的socket服务器和客户端应用。
Python套接字编程
为了了解Python套接字编程,我们需要了解三个有趣的主题——套接字服务器、套接字客户端和套接字。那么,什么是服务器?嗯,服务器是一种等待客户端请求并根据请求提供或处理服务的软件。另一方面,客户端是这个服务的请求者。客户端程序向服务器请求一些资源,服务器响应该请求。套接字是服务器和客户端之间双向通信通道的端点。套接字可以在进程内、同一台机器上的不同进程之间,或不同机器上的进程之间进行通信。对于与远程程序的任何通信,我们必须通过套接字端口连接。本套接字编程教程的主要目标是介绍套接字服务器和客户端如何相互通信。您还将学习如何编写Python套接字服务器程序。
Python Socket 示例
我们之前说过,套接字客户端会向套接字服务器请求一些资源,而服务器则会对该请求做出响应。因此,我们将设计服务器和客户端模型,以便它们之间可以进行通信。这些步骤可以这样考虑。
- 首先,Python套接字服务器程序启动并等待任何请求。
- Python套接字客户端程序将首先发起对话。
- 然后服务器程序将根据客户端请求作出相应回应。
- 如果用户输入”再见”消息,客户端程序将终止。服务器程序也将在客户端程序终止时终止,这是可选的,我们可以让服务器程序无限运行或在客户端请求中使用特定命令终止。
Python套接字服务器
我们将把Python套接字服务器程序保存为socket_server.py。为了使用Python套接字连接,我们需要导入socket模块。然后,按顺序执行一些任务来建立服务器和客户端之间的连接。我们可以使用socket.gethostname()函数获取主机地址。建议使用大于1024的端口地址,因为小于1024的端口号是保留给标准互联网协议的。请参考下面的Python套接字服务器示例代码,注释将帮助您理解代码。
import socket
def server_program():
# 获取主机名
host = socket.gethostname()
port = 5000 # 使用大于1024的端口号
server_socket = socket.socket() # 创建实例
# 请仔细看。bind()函数接受元组作为参数
server_socket.bind((host, port)) # 将主机地址和端口绑定在一起
# 配置服务器可以同时监听的客户端数量
server_socket.listen(2)
conn, address = server_socket.accept() # 接受新连接
print("连接来自: " + str(address))
while True:
# 接收数据流。它不会接受大于1024字节的数据包
data = conn.recv(1024).decode()
if not data:
# 如果没有收到数据就中断
break
print("来自连接的用户: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # 向客户端发送数据
conn.close() # 关闭连接
if __name__ == '__main__':
server_program()
所以我们的Python套接字服务器在端口5000上运行,它将等待客户端请求。如果你希望服务器在客户端断开连接时不退出,只需移除if条件和break语句。Python的while循环用于无限运行服务器程序并等待客户端请求。
Python Socket 客户端
我们将把Python的socket客户端程序保存为socket_client.py。这个程序与服务器程序相似,除了绑定。服务器程序和客户端程序之间的主要区别是,在服务器程序中,需要将主机地址和端口地址绑定在一起。请参考下面的Python socket客户端示例代码,注释将帮助您理解代码。
import socket
def client_program():
host = socket.gethostname() # 因为两个代码都在同一台电脑上运行
port = 5000 # socket服务器端口号
client_socket = socket.socket() # 实例化
client_socket.connect((host, port)) # 连接到服务器
message = input(" -> ") # 获取输入
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # 发送消息
data = client_socket.recv(1024).decode() # 接收响应
print('从服务器收到: ' + data) # 在终端显示
message = input(" -> ") # 再次获取输入
client_socket.close() # 关闭连接
if __name__ == '__main__':
client_program()
scdev$ python3.6 socket_server.py
连接来自: ('127.0.0.1', 57822)
来自连接的用户: Hi
-> Hello
来自连接的用户: How are you?
-> Good
来自连接的用户: Awesome!
-> Ok then, bye!
scdev$
scdev$ python3.6 socket_client.py
-> Hi
从服务器收到: Hello
-> How are you?
从服务器收到: Good
-> Awesome!
从服务器收到: Ok then, bye!
-> Bye
scdev$
请注意,套接字服务器在端口5000上运行,但客户端还需要一个套接字端口来连接到服务器。这个端口是由客户端连接调用随机分配的。在这种情况下,端口号是57822。所以,这就是Python套接字编程、Python套接字服务器和套接字客户端示例程序的全部内容。参考:官方文档。