摘要:本文涵盖了有关使用 Python 进行套接字编程的所有领域。套接字可以帮助您建立这些连接,而 Python 无疑可以简化连接。
本文分享自华为云社区《从零开始学python| 什么是Python中的套接字编程以及如何掌握它?》,原文作者:Yuchuan。
不可否认,互联网已成为“存在之魂”,其活动以“连接”或“网络”为特征。使用套接字的最关键的基础之一,使这些网络成为可能。本文涵盖了有关使用 Python 进行套接字编程的所有领域。套接字可以帮助您建立这些连接,而 Python 无疑可以简化连接。
让我们快速看一下本文涵盖的所有主题:
Why use Sockets?
What are Sockets in Python?
How to achIEve Socket Programming in PythonWhat is a server?
What is a clIEnt?
Echo ClIEnt-Server
Multiple Communications
Transferring Python Objects
Python pickle moduleHow to transfer python objects using the pickle moduleWhy use Sockets?套接字是网络的基础。它们使在两个不同程序或设备之间的信息传输成为可能。例如,当您打开浏览器时,您作为客户端正在与服务器建立连接以进行信息传输。
在深入探讨这种通信之前,让我们首先弄清楚这些插座的确切含义。
What are Sockets?一般而言,套接字是为发送和接收数据而构建的内部端点。单个网络将具有两个套接字,每个通信设备或程序一个。这些套接字是 IP 地址和端口的组合。根据所使用的端口号,单个设备可以具有 n 个插槽。不同的端口可用于不同类型的协议。请看以下图像,以了解有关一些常见端口号和相关协议的更多信息:
现在您已经了解了套接字的概念,现在让我们看一下 Python 的 Socket 模块:
如何在 Python 中实现 Socket 编程:要使用 Python 实现 Socket 编程,您将需要导入 socket 模块或框架。该模块由创建套接字并帮助它们彼此关联所需的内置方法组成。
一些重要的方法如下:
既然您已经了解了套接字模块的重要性,那么让我们继续看一下它如何为 Python 中的套接字编程创建服务器和客户端。
什么是服务器?服务器可以是程序,计算机或专用于管理网络资源的设备。服务器可以在同一台设备或计算机上,也可以在本地连接到其他设备和计算机,甚至可以远程连接。有各种类型的服务器,例如数据库服务器,网络服务器,打印服务器等。
服务器通常使用诸如 socket.socket(),socket.bind(),socket.Listen()等方法来建立连接并绑定到客户端。现在,让我们编写一个程序来创建服务器。考虑以下示例:
例子:
import sockets=socket.socket(socket.AF_INET, socket.soCK_STREAM)s.bind((socket.gethostname(),1234)) #port number can be anything between 0-65535(we usually specify non-previleged ports which are > 1023)s.Listen(5) while True: clt,adr=s.accept() print(f"Connection to {adr}established") #f string is literal string prefixed with f which #contains python Expressions insIDe braces clt.send(bytes("Socket Programming in Python","utf-8 ")) #to send info to clIEntsocket
如您所见,创建套接字的第一个必要条件是导入套接字模块。之后,使用 socket.socket()方法创建服务器端套接字。
NOTE:
AF_INET 是指 Internet 上的地址,它需要一对(主机,端口),其中主机可以是某个特定网站的 URL 或它的地址,并且端口号是整数。SOCK_STREAM 用于创建 TCP 协议。
bind()方法接受两个参数作为元组(主机,端口)。但是,最好使用 4 位数字的端口号,因为通常占用较小的端口号。Listen()方法允许服务器接受连接。在这里,5 是同时出现的多个连接的队列。此处可以指定的最小值为 0(如果您提供较小的值,则将其更改为 0)。如果未指定任何参数,则采用默认的合适参数。
在 while 循环允许接受连接永远。“ clt”和“ adr”是客户端对象和地址。print 语句仅打印出客户端套接字的地址和端口号。最后,clt.send 用于发送字节数据。
现在我们的服务器已经准备好了,让我们继续前进到客户端。
什么是客户端?客户端是从服务器接收信息或服务的计算机或软件。在客户端服务器模块中,客户端从服务器请求服务。最好的例子是 Web 浏览器,例如 Google Chrome,firefox 等。这些 Web 浏览器向 Web 服务器请求用户指示的所需网页和服务。其他示例包括在线游戏,在线聊天等。
现在让我们看一下如何用 Python 编程语言编写客户端程序:
例子:
import sockets=socket.socket(socket.AF_INET, socket.soCK_STREAM)s.connect((socket.gethostname(), 2346))msg=s.recv(1024)print(msg.decode("utf-8"))
第一步是导入套接字模块,然后创建套接字,就像创建服务器时一样。然后,要在客户端-服务器之间创建连接,您需要通过指定(主机,端口)使用 connect()方法。
注意:当客户端和服务器位于同一台计算机上时,将使用 gethostname。(LAN –本地 IP / WAN –公用 IP)
在这里,客户端希望从服务器接收一些信息,为此,您需要使用 recv()方法,并且该信息存储在另一个变量 msg 中。请记住,传递的信息将以字节为单位,并且在上述程序的客户端中,一次传输最多可接收 1024 个字节(缓冲区大小)。可以指定任意数量,具体取决于传输的信息量。
最后,正在传输的消息应进行解码和打印。
既然您已经知道如何创建客户端-服务器程序,那么让我们继续看看如何执行它们。
Echo ClIEnt-Server:要执行这些程序,请打开命令提示符,进入创建了客户端和服务器程序的文件夹,然后键入:
py server.py(在这里,server.py 是服务器的文件名,您也可以使用 py -3.7server.py)
完成此 *** 作后,服务器将开始运行。要执行客户端,请打开另一个 cmd 窗口,然后键入:
py clIEnt.py(此处,clIEnt.py 是客户端的文件名)
输出(服务器):
(客户)
让我们通过将缓冲区大小减小到 7 来尝试相同的程序,然后看看我们得到什么输出:
输出:
如您所见,连接在传输 7 个字节后终止。但这是一个问题,因为您尚未收到完整的信息,并且连接已关闭。让我们继续解决这个问题。
Multiple Communications:为了使连接一直持续到客户端收到完整的信息,可以使用 while 循环:
例子:
import sockets=socket.socket(socket.AF_INET, socket.soCK_STREAM)s.connect((socket.gethostname(), 2346))while True:msg=s.recv(7)print(msg.decode("utf-8"))
完成此 *** 作后,每次传输将以 7 个字节的形式接收完整的消息。
但是这一次,如您所见,连接不会终止,您也不知道何时会发生连接。除此之外,如果您实际上不知道客户端将从服务器接收到的消息或信息有多大,该怎么办。在这种情况下,您实际上可以在客户端使用以下代码:
例子:
complete_info=''while True: msg = s.recv(7) if len(msg)<=0: break complete_info += msg.decode("utf-8")print(complete_info)
在服务器端,使用 close()方法,如下所示:
clt.close()
输出如下图所示:
输出:
上面的代码块所做的全部工作是,检查信息的大小,并一次将其打印在两个字节的缓冲区中,再在完成连接后将其关闭。
传输 Python 对象:直到这里,您才有了传输字符串的诀窍。但是,Python 中的套接字编程也允许您传输 Python 对象。这些对象可以是集合,元组,字典等任何对象。要实现此目的,您将需要导入 Python 的 pickle 模块。
Python pickle 模块:当您实际上在 python 中序列化或反序列化对象时,Pythonpickle 模块就会出现。让我们看一个小例子
例子:
import pickle myList=[1,2,'abc']mymsg = pickle.dumps(myList) print(mymsg)
输出: b'x80x03] qx00(Kx01Kx02Xx03x00x00x00abcqx01e。
如您所见,在上面的程序中,使用 pickle 模块的 dumps()函数对'myList'进行了序列化。还要注意,输出以“ b”开头,这意味着它已转换为字节。在套接字编程中,可以实现此模块以在客户端和服务器之间传输 python 对象。
如何使用 pickle 模块传递 python 对象结构?当您将泡菜与套接字一起使用时,您绝对可以通过网络传输任何内容。让我们写下服务器端和客户端对应项,以将列表从服务器传输到客户端:
服务器端:import socketimport pickle a=10s=socket.socket(socket.AF_INET, socket.soCK_STREAM)s.bind((socket.gethostname(), 2133)) #binding tuples.Listen(5)while True: clt , adr = s.accept() print(f"Connection to {adr}established") m={1:"ClIEnt", 2:"Server"} mymsg = pickle.dumps(m) #the msg we want to print later mymsg = {len(mymsg):{a}}"utf-8") + mymsg clt.send(mymsg)
在这里,m 是一个字典,它基本上是一个 python 对象,需要从服务器发送到客户端。这是通过首先使用 dumps()序列化对象,然后将其转换为字节来完成的。
现在让我们写下客户端对应的内容:
客户端:import socketimport picklea=10s=socket.socket(socket.AF_INET, socket.soCK_STREAM)s.connect((socket.gethostname(), 2133)) while True: complete_info = b'' rec_msg = True while True: mymsg = s.recv(10) if rec_msg: print(f"The length of message = {mymsg[:a]}") x = int (mymsg[:a ] ) rec_msg = False complete_info += mymsg if len(complete_info)-a == x: print("RecIEved the complete info") print(complete_info[a:]) m = pickle.loads(complete_info[a:]) print(m) rec_msg = Truecomplete_info = b''print(complete_info)
第一个 while 循环将帮助我们跟踪完整消息(complete_info)以及正在使用缓冲区接收的消息(rec_msg)。通过设置 rec_设置消息,然后,在接收消息时,我所做的就是打印每个消息,并在大小为 10 的缓冲区中接收该消息。此大小可以是任何值,具体取决于您的个人选择。然后,如果收到的消息等于完整的消息,那么我只是将消息打印为已接收的完整信息,然后使用 loads()将消息反序列化。
上面程序的输出如下:
这使我们结束了有关使用 Socket 进行编程的本文的结尾。希望您能清楚地理解所有概念。
点击关注,第一时间了解华为云新鲜技术~
总结
以上是内存溢出为你收集整理的什么是 Python 中的套接字编程?全部内容,希望文章能够帮你解决什么是 Python 中的套接字编程?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)