python的封装的含义是,python函数的封装
摘要:本文涵盖了使用Python进行套接字编程的所有相关领域。套接字有助于建立这些连接,但是Python当然可以简化它们。
本文来自华为云社区《从零开始学python 什么是Python中的套接字编程以及如何掌握它?》。原作者是于川。
不可否认,互联网已经成为“存在的灵魂”,其活动具有“连接性”和“网络性”的特点。http://www.Sina.com/,使用3套接字的最重要的基础之一,使这些网络成为可能。本文涵盖了使用Python进行套接字编程的所有领域。套接字有助于建立这些连接,但是Python当然可以简化它们。
让我们简要地看一下本文中涉及的所有主题。
为什么要用插座?
Python中的套接字是什么?
如何实现howtoachievesocketprogramminginpython
什么是服务器?
什么是客户?
Echo客户端-服务器
多重通信
传输类型对象
python pickle module howtotransfer python objects using pickle module 3358 www.Sina.com/socket是网络的基础。它们可以实现两个不同程序或设备之间的信息传输。比如打开浏览器,作为客户端连接到服务器进行信息传输。
在详细讨论这种通信之前,我们先搞清楚这些套接字的确切含义。
。一般来说,套接字是为发送和接收数据而构建的内部端点。在网络中,每个通信设备或程序都有两个套接字。这些套接字是IP地址和端口的组合。根据使用的端口号,一个设备可以设置N个插槽。不同类型的协议可以使用不同的端口。常见端口号及相关协议详情,请参考下图:
现在我们已经了解了socket的概念,让我们来看看Python的socket模块。
3358 www.sina.com/3358 www.sina.com/3358 www.sina.com/http://www.sina.com/or皮查/com
一些重要的方法如下
现在我们知道了socket模块的重要性,让我们看看如何用Python创建socket编程的服务器和客户端。
Why use Sockets?服务器可以是管理程序、计算机或网络资源的专用设备。服务器可以本地或远程连接到同一台设备或计算机、其他设备和计算机。有数据库服务器,网络服务器,打印服务器和其他类型的服务器。
服务器通常通过socket.socket()、socket.bind (socket.listen))等方法建立连接并绑定到客户端。现在,让我们创建一个程序来创建一个服务器。考虑下面的例子:
What are Sockets?
import sockets=socket . socket(socket . af _ inet,socket。SOCK _ STREAM)s . bind))socket . get hostname,1234)port number可以是0- 65535之间的任何值(我们通常指定1023的非优先端口)s . listen(5)whill en Established )fsgislitalterstringprifiedwithfwith which # contains pythone表达式SIDEBRACSCLT。SEND(bytes)“UTF-8”))to sendinfotoclient然后使用socket.socket()方法创建服务器端套接字。
358 www.Sina.com/http://www.Sina.com/af _ inet是一个互联网地址,需要一对(主机和端口)。
其中主机可以是特定网站的URL或其地址,端口号是整数。SOCK_STREAM用于创建TCP协议。
bind()方法接受两个参数作为元组(主机,端口)。但是,最好使用4位数的端口号,因为它通常占用较小的端口号。listen()方法允许服务器接受连接。这里,5是同时出现的多个连接的队列。您可以在此处指定的最小值为0(如果您提供了一个较小的值,请将其更改为0)。如果没有指定参数,则采用默认的适当参数。
while循环允许您永远接受连接。Clt和adr是客户端对象和地址。Print语句只打印出客户机套接字的地址和端口号。最后,clt.send用于发送字节数据。
现在我们的服务器已经准备好了,让我们继续客户端。
什么是客户端?客户端是从服务器接收信息或服务的计算机或软件。在客户机服务器模块中,客户机向服务器请求服务。最好的例子就是网页浏览器,比如谷歌Chrome、火狐等。这些Web浏览器从Web服务器请求用户指示的所需网页和服务。其他例子包括在线游戏、在线聊天等。
现在让我们看看如何用Python编程语言编写客户端程序:
例子:
import sockets=socket . socket(socket . af _ inet,socket . sock _ stream)s . connect((socket . get hostname(),2346))msg=s . recv(1024)print(msg . decode( UTF-8 ))第一步是导入。然后,要在客户机和服务器之间创建连接,您需要通过指定(host,port)来使用connect()方法。
注意:当客户端和服务器在同一台计算机上时,将使用gethostname。(局域网本地IP/广域网公共IP)
这里,客户机希望从服务器接收一些信息。为此,需要使用recv()方法,这些信息存储在另一个变量msg中。请记住,传输的信息将以字节为单位,在上述程序的客户端中,一次传输最多可以接收1024字节(缓冲区大小)。根据传输的信息量,您可以指定任意数量。
最后,被传输的信息应该被解码和打印。
既然你已经知道了如何创建客户机-服务器程序,让我们来看看如何执行它们。
Echo Client-Server:要执行这些程序,请打开命令提示符,输入创建客户端和服务器程序的文件夹,然后键入:
Py server.py(这里server.py是服务器的文件名,也可以用py -3.7 server.py)
完成此操作后,服务器将开始运行。要执行客户端,请打开另一个cmd窗口并键入:
Py.py(这里client.py是客户端的文件名)
输出(服务器):
(客户)
让我们通过将缓冲区大小减少到7来尝试相同的程序,然后看看我们得到什么输出:输出:
如您所见,在传输7个字节后,连接被终止。但这是一个问题,因为你没有收到完整的信息,连接已经关闭。让我们继续解决这个问题。
Multiple Communications:为了使连接持续到客户端收到完整的信息,可以使用while循环:
例子:
import sockets=socket . socket(socket . af _ inet,socket . sock _ stream)s . connect((socket . get hostname(),2346))而true:msg=s . recv(7)print(msg . decode( UTF-8 ))来完成这个
但是这一次,你可以看到,连接不会被终止,你不知道什么时候会发生。此外,如果您实际上不知道客户端将从服务器接收到多大的消息或信息,该怎么办。在这种情况下,您实际上可以在客户端使用以下代码:
例子:
Complete _ info= 当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中实际序列化或者反序列化一个对象的时候,Python pickle模块就会出现。我们来看一个小例子,例子:。
import pickle mylist=[1,2, ABC ]mymsg=pickle . dumps(my list)print(mymsg)输出:b x80x 03]qx00(kx 01 x02 x 03 x 00x 00 x 00 ABC qx01e .
如你所见,在上面的程序中,‘my list’是使用pickle模块的dumps()函数序列化的。还要注意,输出以“B”开头,这意味着它已经被转换为字节。在socket编程中,可以实现这个模块在客户机和服务器之间传输python对象。
如何使用pickle模块传递python对象结构?使用带插座的泡菜时,绝对可以通过网络传输任何内容。让我们记下服务器端和客户端的对应关系,以便将列表从服务器传输到客户端:
服务器端:
导入socket import pickle a=10s=socket . socket(socket。AF_INET,socket。SOCK _ STREAM)s . bind((socket . get hostname(),2133))# binding tuples . listen(5)while True:CLT,adr=s.accept() print(f 连接{adr}established) m={1:Client ,2: server } mymsg=pickle . dumps(m)#后面要打印的msg mymsg={ len(mymsg):{ a } UTF-8 )mymsg CLT . send(mymsg)这里m是一个字典,基本上是一个需要发送的python对象这是通过首先用dumps()序列化对象,然后将其转换为字节来完成的。现在让我们记下客户端的相应内容:
客户端:
import socket import pick lea=10s=socket . socket(socket。AF_INET,socket。SOCK _ STREAM)s . connect((socket . get hostname(),2133))while True:complete _ info=b rec _ msg=True while True:mymsg=s . recv(10)if rec _ msg:Print(f 消息长度={ mymsg[:a]} )x=int(mymsg[:a])rec _ msg=False complete _ info=mymsg if len(complete _ info)-a==x:Print(接收到完整信息)Print (complete_info [a:]) m=消息长度通过设置rec_来设置消息,然后,在接收消息时,我所做的就是打印每条消息,并在一个大小为10的缓冲区中接收它。这个大小可以是任何值,取决于您的个人选择。
然后,如果接收到的消息等于完整的消息,那么我只是将消息打印为接收到的完整信息,然后使用loads()对消息进行反序列化。上述程序的输出如下:
这就把我们带到了这篇关于Socket编程的文章的结尾。我希望你能清楚地理解所有的概念。
点击关注,第一时间了解华为云新鲜技术~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。