摘要:本文涵盖了有关使用Python进行套接字编程的所有领域。套接字可以帮助您建立这些连接,而Python无疑可以简化连接。

本文分享自华为云社区《从零开始学python | 什么是Python中的套接字编程以及如何掌握它?》,原文作者:Yuchuan 。

不可否认,互联网已成为“存在之魂”,其活动以“连接”或“网络”为特征。使用套接字的最关键的基础之一,使这些网络成为可能本文涵盖了有关使用Python进行套接字编程的所有领域。套接字可以帮助您建立这些连接,而Python无疑可以简化连接。

让我们快速看一下本文涵盖的所有主题:

Why use Sockets?
What are Sockets in Python? 
How to achieve Socket Programming in Python
What is a server?
What is a client?
Echo Client-Server
Multiple Communications
Transferring Python Objects

  • Python pickle module
  • How to transfer python objects using the pickle module

Why use Sockets?

套接字是网络的基础。它们使在两个不同程序或设备之间的信息传输成为可能。例如,当您打开浏览器时,您作为客户端正在与服务器建立连接以进行信息传输。

在深入探讨这种通信之前,让我们首先弄清楚这些插座的确切含义。

What are Sockets?

一般而言,套接字是为发送和接收数据而构建的内部端点。单个网络将具有两个套接字,每个通信设备或程序一个。这些套接字是IP地址和端口的组合。根据所使用的端口号,单个设备可以具有n个插槽。不同的端口可用于不同类型的协议。请看以下图像,以了解有关一些常见端口号和相关协议的更多信息:

现在您已经了解了套接字的概念,现在让我们看一下Python的Socket模块:

如何在Python中实现Socket编程:

要使用Python实现Socket编程,您将需要导入socket模块或框架。该模块由创建套接字并帮助它们彼此关联所需的内置方法组成。

一些重要的方法如下:

既然您已经了解了套接字模块的重要性,那么让我们继续看一下它如何为Python中的套接字编程创建服务器和客户端。

什么是服务器?

服务器可以是程序,计算机或专用于管理网络资源的设备。服务器可以在同一台设备或计算机上,也可以在本地连接到其他设备和计算机,甚至可以远程连接。有各种类型的服务器,例如数据库服务器,网络服务器,打印服务器等。

服务器通常使用诸如socket.socket(),socket.bind(),socket.listen()等方法来建立连接并绑定到客户端。现在,让我们编写一个程序来创建服务器。考虑以下示例:

例子:

import socket
s=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 bracesclt.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 socket
s=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.7 server.py)

完成此操作后,服务器将开始运行。要执行客户端,请打开另一个cmd窗口,然后键入:

py client.py(此处,client.py是客户端的文件名)

输出(服务器): 

(客户)

让我们通过将缓冲区大小减小到7来尝试相同的程序,然后看看我们得到什么输出:
输出: 

如您所见,连接在传输7个字节后终止。但这是一个问题,因为您尚未收到完整的信息,并且连接已关闭。让我们继续解决这个问题。

Multiple Communications:

为了使连接一直持续到客户端收到完整的信息,可以使用while循环:

例子:

import socket
s=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:breakcomplete_info += msg.decode("utf-8")
print(complete_info)

在服务器端,使用close()方法,如下所示:

clt.close()

输出如下图所示:

输出:

上面的代码块所做的全部工作是,检查信息的大小,并一次将其打印在两个字节的缓冲区中,再在完成连接后将其关闭。

传输Python对象:

直到这里,您才有了传输字符串的诀窍。但是,Python中的套接字编程也允许您传输Python对象。这些对象可以是集合,元组,字典等任何对象。要实现此目的,您将需要导入Python的pickle模块。

Python pickle模块:

当您实际上在python中序列化或反序列化对象时,Python pickle模块就会出现。让我们看一个小例子,

例子:

import picklemylist=[1,2,'abc']
mymsg = pickle.dumps(mylist)
print(mymsg)

输出: b'x80x03] qx00(Kx01Kx02Xx03x00x00x00abcqx01e。

如您所见,在上面的程序中,使用pickle模块的dumps()函数对'mylist'进行了序列化。还要注意,输出以“ b”开头,这意味着它已转换为字节。在套接字编程中,可以实现此模块以在客户端和服务器之间传输python对象。

如何使用pickle模块传递python对象结构?

当您将泡菜与套接字一起使用时,您绝对可以通过网络传输任何内容。让我们写下服务器端和客户端对应项,以将列表从服务器传输到客户端:

服务器端:

import socket
import picklea=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 2133))        #binding tuple
s.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 latermymsg = {len(mymsg):{a}}"utf-8") + mymsgclt.send(mymsg)

在这里,m是一个字典,它基本上是一个python对象,需要从服务器发送到客户端。这是通过首先使用dumps()序列化对象,然后将其转换为字节来完成的。现在让我们写下客户端对应的内容:

客户端:

import socket
import pickle
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2133))while True:complete_info = b''rec_msg = Truewhile True:mymsg = s.recv(10)if rec_msg:print(f"The length of message = {mymsg[:a]}")x = int (mymsg[:a ] )rec_msg = Falsecomplete_info += mymsgif len(complete_info)-a == x:print("Recieved the complete info")print(complete_info[a:])m = pickle.loads(complete_info[a:])print(m)rec_msg = True
complete_info = b''
print(complete_info)

第一个while循环将帮助我们跟踪完整消息(complete_info)以及正在使用缓冲区接收的消息(rec_msg)。通过设置rec_设置消息,然后,在接收消息时,我所做的就是打印每个消息,并在大小为10的缓冲区中接收该消息。此大小可以是任何值,具体取决于您的个人选择。

然后,如果收到的消息等于完整的消息,那么我只是将消息打印为已接收的完整信息,然后使用loads()将消息反序列化。上面程序的输出如下:

这使我们结束了有关使用Socket进行编程的本文的结尾。希望您能清楚地理解所有概念。

点击关注,第一时间了解华为云新鲜技术~

什么是Python中的套接字编程?相关推荐

  1. Python中的套接字编程

    文章目录 **连接到服务器:** **一个简单的服务器客户端程序:** **服务器** **客户端** 套接字编程是一种连接网络上的两个节点以相互通信的方法.一个套接字(节点)侦听 IP 处的特定端口 ...

  2. 浅析C#中的套接字编程

    套接字基本概念: 套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面.套接字存在于通信域中 ...

  3. 自学Python 58 Socket套接字编程 (一)

    Python Socket套接字编程 (一) 文章目录 Python Socket套接字编程 (一) 一.库 Socket 内置函数和属性 二.Python中的socket通信逻辑   Socket又 ...

  4. C#中的套接字编程(一) --转

    TCP/IP 体系结构与特点     TCP/IP协议实际上就是在物理网上的一组完整的网络协议.其中TCP是提供传输层服务,而IP则是提供网络层服务.TCP/IP包括以下协议:     IP:网间协议 ...

  5. python socket send_全网最详细python中socket套接字send与sendall的区别

    将数据发送到套接字. 套接字必须连接到远程套接字.  返回发送的字节数. 应用程序负责检查是否已发送所有数据; 如果仅传输了一些数据, 则应用程序需要尝试传递剩余数据.(需要用户自己完成) 将数据发送 ...

  6. C#中的套接字编程(二) --转

    客户端程序的代码编写:     布置界面.往界面上添加一个ListBox控件(用于显示用户列表),一个RichTextBox控件(用于显示聊天消息以及系统消息),一个 TextBox控件(用于发送消息 ...

  7. python的socket编程接收浏览器上传的文件_使用python套接字编程将文件发送到浏览器...

    我正在尝试使用python(仅限于套接字编程)向客户机(浏览器:Chrome)发送一个文件(mp3).我的问题是文件被下载了,而不是在浏览器上进行流式传输.我不明白我哪里错了.请告诉我.在 另外,下载 ...

  8. java套接字编程_Java套接字编程:教程

    java套接字编程 本教程是Java套接字编程的简介,从一个简单的客户机-服务器示例开始,该示例演示了Java I / O的基本功能. 将向您介绍原始的java.io软件包和NIO,即Java 1.4 ...

  9. python中typeerror怎么解决_Python 3中套接字编程中遇到TypeError: 'str' does not support the buffer interface的解决办法...

    目前正在学习python,使用的工具为python3.2.3.发现3x版本和2x版本有些差异,在套接字编程时,困扰了我很久,先将python核心编程书中的例子 代码如下: 服务器端: #Echo se ...

最新文章

  1. leeds计算机科学理学硕士,利兹大学数学及计算机科学理学硕士研究生申请要求及申请材料要求清单...
  2. vimrc for windows
  3. 一个简单的jQuery例子,动态添加表格和删除
  4. custom configuration DB and creation logic
  5. java开发学生管理系统,看这篇足矣了!
  6. 图像处理之特征描述与匹配
  7. 新商业时代最大的机会在于创业市场
  8. windows server 2008中IIS7的功能模塊
  9. ppt格式刷快捷键_15个PPT神操作,让老师做课件的效率翻倍!
  10. HDU 3072 (强连通分量)
  11. 【ANSYS命令流】通用后处理技术(一):读取结果文件
  12. vscode通过ssh远程连接服务器
  13. winXP系统如何打开剪贴板查看器
  14. 两台计算机如何打印机共享打印机,多台电脑怎样共享一台打印机?方法就是这么简单!...
  15. 图像处理工具包实现应用图像效果
  16. 全媒舍:活动策划的几个要点与常用做法
  17. Facebook机密文件外泄或将终结这家社交媒体巨头
  18. centos7+PHP7 编译安装swoole教程
  19. FFmpeg av_dump_format函数使用
  20. 献给减肥族的四例菜谱

热门文章

  1. 云速美建站手机端使用百度app打开手机端网站闪退的问题
  2. 显卡测试软件毛毛虫,ATI Radeon Xpress200M与Intel GMA950谁强些?
  3. K8s基础入门及实战
  4. IDM下载器使用方法详解:百度网盘下载,视频会员一网打尽!
  5. 点亮LED-STM32电控学习笔记03
  6. ddl是什么(ddl是什么软件)
  7. 【VSCode】提升效率
  8. 卸载chrome浏览器_如何在Chrome,Firefox和其他浏览器中卸载扩展程序
  9. 个人总结之前端技巧-----页面的设计流程
  10. 为什么大家都喜欢使用宝塔面板?