paint-brush
Python 套接字编程基本指南:客户端、服务器和对等库经过@pubnub
4,574 讀數
4,574 讀數

Python 套接字编程基本指南:客户端、服务器和对等库

经过 PubNub5m2023/03/06
Read on Terminal Reader

太長; 讀書

在本教程中,您将学习如何使用 Python 套接字编程和套接字 API 在客户端和服务器之间交换数据。本教程中使用的源代码可以在 [GitHub 存储库] 中找到:https://github.com/PubNubDevelopers/python-socket-demo。
featured image - Python 套接字编程基本指南:客户端、服务器和对等库
PubNub HackerNoon profile picture
0-item

在本教程中,您将学习如何使用 Python 套接字编程和套接字 API 在客户端和服务器之间交换数据。稍后,本教程将讨论使用托管提供程序在两个或多个 Python 客户端之间直接交换数据。本教程中使用的源代码可以在GitHub 存储库中找到。


套接字编程连接两个套接字(一个客户端套接字和一个服务器套接字)并允许它们实时双向通信。直接套接字连接可以使所有实时应用程序受益,因为可以随时发送或接收数据。

环境搭建

您需要在计算机上安装Python 3.x 版的稳定版本。如果您是 Windows 用户,您可以选择将 Python 添加到您的 PATH 中。


您还需要一个代码编辑器来学习本教程。


Visual Studio Code是一种流行的开源和免费代码编辑器,支持多种语言和框架,包括 Python。


VSCode 还支持 Python 的扩展,以帮助完成代码和调试。

构建并运行 Python 套接字应用程序

让我们使用 Python 构建一个简单的套接字应用程序。 Python 提供了一个原生的套接字类(socket 模块),因此开发者不需要依赖外部库。首先设置 Python 套接字客户端和服务器:


Python套接字栈


在项目目录中创建文件client.py 。要使用套接字,请导入 Python 套接字库并创建一个连接到指定 IP 地址的新套接字对象(在本例中,本地主机的端口号为 8080,但您可以选择任何 ipv4 地址)。


新建一个到socket服务器的连接,向TCP服务器发送数据,关闭socket连接。


您的client.py文件应如下所示:


 import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('0.0.0.0', 8080)) client.send("I am CLIENT\n".encode()) from_server = client.recv(4096) client.close() print (from_server.decode())


您将需要一个套接字服务器来侦听来自客户端的传入连接和消息。


创建文件server.py并添加以下内容:


 import socket serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv.bind(('0.0.0.0', 8080)) serv.listen(5) while True: conn, addr = serv.accept() from_client = '' while True: data = conn.recv(4096) if not data: break from_client += data.decode('utf8') print (from_client) conn.send("I am SERVER\n".encode()) conn.close() print ('client disconnected and shutdown')


Server.py将套接字对象绑定到端口 8080 上的主机名 (localhost),并持续侦听新的客户端连接。当客户端连接到这个地址时,服务器接受连接并读取任何数据。


一旦从客户端成功读取数据,服务器提供数据响应,此时客户端终止连接。


要自己对此进行测试,请同时打开两个终端窗口。在一个窗口中,运行:


 python3 server.py


在第二个窗口中,运行:


 python3 client.py


请注意,服务器会继续运行,并且会在您每次运行客户端并附加任何新输出时建立一个新连接。


客户端会将“I am CLIENT”字符串发送到服务器并等待回复。服务器将读取客户端的消息,将其输出到终端,并向客户端发回响应。


Python 套接字示例

使用 PubNub 在 Python 中进行套接字编程

到目前为止,本教程涵盖了服务器和客户端之间的消息交换,但是如果您需要在 Python 客户端之间直接通信怎么办?


直接在两个或多个客户端设备之间发送数据很棘手,因为随着设备数量的增加,您会遇到许多扩展和安全问题。


客户端-服务器架构用于调节和管理客户端到客户端的通信。如果您没有 Web 服务器,或者您担心服务器会扩展以满足应用程序的需求,您应该选择托管的实时通信解决方案,例如PubNub


PubNub 的跨平台 SDK,包括Python ,可以识别用户并将消息发送到特定频道,只有订阅的客户才会收到。

客户端到客户端 Python 套接字编程

那么,如何使用 PubNub 编写前面介绍的简单应用程序以在两个客户端之间直接交换消息?必须理解,尽管 PubNub 使用“发布”和“订阅”架构 (pub/sub) 在端点之间发送和接收双向消息,但它仍然在幕后使用套接字。 PubNub 为您提供了套接字通信的好处,而无需担心 Python 网络编程的细节,并且无论操作系统如何,都可以在客户端之间保持始终在线的连接。


要将 PubNub 集成到项目中,请在终端中使用 pip 安装 PubNub 包;这将允许您使用PubNub Python SDK并与 PubNub 基础设施通信。


 pip3 install 'pubnub>=7.1.0'


您将需要创建两个客户端来连接到 PubNub 网络并通过其进行通信。创建文件pn_client_1.py并添加以下代码:


 from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub import time import os pnconfig = PNConfiguration() userId = os.path.basename(__file__) pnconfig.publish_key = 'demo' pnconfig.subscribe_key = 'demo' pnconfig.user_id = userId pnconfig.ssl = True pubnub = PubNub(pnconfig) def my_publish_callback(envelope, status): # Check whether request successfully completed or not if not status.is_error(): pass class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass def status(self, pubnub, status): pass def message(self, pubnub, message): if message.publisher == userId : return print ("from device " + message.publisher + ": " + message.message) pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels("chan-1").execute() ## publish a message while True: msg = input("") if msg == 'exit': os._exit(1) pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)


创建文件pn_client_2.py并添加与用于pn_client_1.py相同的代码

上面的代码使用“演示”密钥,但您可以免费获得自定义 PubNub 密钥。


在两个不同的终端窗口中同时运行pn_client_1.pypn_client_2.py


 python3 pn_client_1.py


 python3 pn_client_2.py


每个客户端初始化其与 PubNub 网络的连接,并订阅在新消息发布到chan-1通道时接收它们。您可以将其视为通过 Python 中的 TCP 套接字发送数据;在幕后,PubNub 正在为您创建和管理套接字,并将您的消息路由到所有正在侦听它的客户端。一旦远程客户端收到消息,收到的消息就会显示在命令行上。


Python PubNub 示例


这就是它的全部!有关使用 PubNub 进行开发的更多信息,请查看我们的教程系列。或者,查看PubNub 交互式实时导览,了解该平台如何为应用程序提供实时交互。 PubNub 支持 TCP 和 UDP 数据报通信,以及 Linux、Unix 和 Windows。


也发布在这里:https: //www.pubnub.com/blog/socket-programming-in-python-client-server-p2p/