大家好,学习者们!在我们的上一个教程中,我们讨论了Python unittest模块。今天我们将深入探讨Python套接字编程的示例。我们将创建Python套接字服务器和客户端应用程序。
Python套接字编程
为了理解Python套接字编程,我们需要了解三个有趣的主题 – 套接字服务器,套接字客户端和套接字。那么,什么是服务器?嗯,服务器是一种等待客户请求并相应地提供或处理它们的软件。另一方面,客户端是此服务的请求者。客户端程序请求服务器的一些资源,服务器响应该请求。套接字是服务器和客户端之间双向通信通道的端点。套接字可以在进程内、同一台机器上的不同进程之间,或不同机器上的进程之间进行通信。对于与远程程序的任何通信,我们都必须通过套接字端口连接。这个套接字编程教程的主要目标是介绍套接字服务器和客户端如何相互通信。您还将学习如何编写Python套接字服务器程序。
Python套接字示例
我们之前提到过,套接字客户端请求套接字服务器的一些资源,而服务器会对该请求进行响应。因此,我们将设计服务器和客户端模型,以便每个模型都可以与它们通信。步骤可以考虑如下。
- Python套接字服务器程序首先执行并等待任何请求
- Python套接字客户端程序将首先启动对话。
- 然后服务器程序将根据客户端的请求进行相应。
- 如果用户输入“bye”消息,客户端程序将终止。服务器程序也将在客户端程序终止时终止,这是可选的,我们可以使服务器程序无限期运行,或者通过客户端请求中的某些特定命令终止。
Python套接字服务器
我们将保存 Python 套接字服务器程序为 socket_server.py
。要使用 Python 套接字连接,我们需要导入 socket 模块。然后,按顺序执行一些任务以建立服务器和客户端之间的连接。我们可以使用 socket.gethostname()
函数获取主机地址。建议使用端口号大于 1024,因为小于 1024 的端口号保留供标准互联网协议使用。查看下面的 Python 套接字服务器示例代码,注释将帮助您理解代码。
import socket
def server_program():
# 获取主机名
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# 注意。bind() 函数接受元组作为参数
server_socket.bind((host, port)) # bind host address and port together
# 配置服务器可以同时监听多少个客户端
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# 接收数据流。它不会接受大于 1024 字节的数据包
data = conn.recv(1024).decode()
if not data:
# 如果未收到数据,则退出
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
server_program()
所以我们的 Python 套接字服务器正在端口 5000 上运行,并且它将等待客户端请求。如果希望服务器在客户端连接关闭时不退出,只需移除 if 条件 和 break 语句。Python while 循环 用于无限地运行服务器程序并等待客户端请求。
Python 套接字客户端
我们将把 Python 套接字客户端程序保存为 socket_client.py
。该程序与服务器程序相似,除了绑定外。服务器程序和客户端程序的主要区别在于,服务器程序需要将主机地址和端口地址绑定在一起。查看下面的 Python 套接字客户端示例代码,注释将帮助您理解代码。
import socket
def client_program():
host = socket.gethostname() # as both code is running on same pc
port = 5000 # socket server port number
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
message = input(" -> ") # take input
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' + data) # show in terminal
message = input(" -> ") # again take input
client_socket.close() # close the connection
if __name__ == '__main__':
client_program()
Python 套接字编程输出
要查看输出,请先运行套接字服务器程序。然后运行套接字客户端程序。然后,从客户端程序中写入一些内容。然后再从服务器程序中写入回复。最后,从客户端程序中写入 bye 以终止两个程序。以下简短视频将展示套接字服务器和客户端示例程序的测试运行情况。
pankaj$ python3.6 socket_server.py
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
-> Hello
from connected user: How are you?
-> Good
from connected user: Awesome!
-> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py
-> Hi
Received from server: Hello
-> How are you?
Received from server: Good
-> Awesome!
Received from server: Ok then, bye!
-> Bye
pankaj$
请注意,套接字服务器正在端口 5000 上运行,但客户端还需要一个套接字端口来连接服务器。此端口由客户端连接调用随机分配。在本例中,它是 57822。所以,这就是 Python 套接字编程、Python 套接字服务器和套接字客户端示例程序的全部内容。参考:官方文档
Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client