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():
# get the hostname
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# look closely. The bind() function takes tuple as argument
server_socket.bind((host, port)) # bind host address and port together
# configure how many client the server can listen simultaneously
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# receive data stream. it won't accept data packet greater than 1024 bytes
data = conn.recv(1024).decode()
if not data:
# if data is not received break
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 Socket 客户端
我们将把Python的socket客户端程序保存为socket_client.py。这个程序与服务器程序相似,除了绑定。服务器程序和客户端程序之间的主要区别是,在服务器程序中,需要将主机地址和端口地址绑定在一起。请参考下面的Python socket客户端示例代码,注释将帮助您理解代码。
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()
scdev$ 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!
scdev$
scdev$ 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
scdev$
请注意,套接字服务器在端口5000上运行,但客户端还需要一个套接字端口来连接到服务器。这个端口是由客户端连接调用随机分配的。在这种情况下,端口号是57822。所以,这就是Python套接字编程、Python套接字服务器和套接字客户端示例程序的全部内容。参考:官方文档。