Python中的套接字编程是什么?

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 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 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:
        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(mylist)
print(mymsg)

输出:

b'x80x03] qx00(Kx01Kx02Xx03x00x00x00abcqx01e。

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

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

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

服务器端:

import socket
import pickle

a=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 later
    mymsg = {len(mymsg):{a}}"utf-8") + mymsg
    clt.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 = 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 = True
complete_info = b''
print(complete_info)

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

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

到此这篇关于Python中的套接字编程是什么?的文章就介绍到这了,更多相关Python套接字编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python socket 套接字实现通信详解

    首先:我们介绍一下socket什么是socket: 1. socket 在操作系统中它是处于应用层与传输层的抽象层,它是一组操作起来非常简单的接口(接收数据的),此接口接受数据之后交个操作系统 那么为什么?直接给操作系统不是更方便吗?那么你就想错了 因为操作系统的接口远比我们想象的要丑陋复杂,使用操作系统交换数据,非诚繁琐,,开发者们只能想办法让一个中间人和他们打交道,来简单的实现数据交换,那么就是socket套接字.它的作用就是:与操作系统之间数据交换将这些繁琐的操作,进行高度化封装,和简化,

  • Python原始套接字编程实例解析

    这篇文章主要介绍了Python原始套接字编程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送. 使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的

  • Python实现socket库网络通信套接字

    Socket 套接字:通讯端点 简介 socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). Socket 是任何一种计算机网络通讯中最基础的内容.Socket通讯一般用户C/S结构系统的网络通讯. Socket 网络通讯是基于TCP(传输控制协议)或UDP(用户数据报协议)两种协议

  • Python网络编程 Python套接字编程

    Python 提供了两个级别访问的网络服务. 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyth

  • Python网络编程之TCP套接字简单用法示例

    本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而java则一知半解,C写起来又麻烦,所以一直都没有真正实现过TCP套接字编程. 最近学习了python,而用它来写套接字又十分方便简单,所以当然要试一试咯. 下面根据代码来介绍一下最简单的tcp程序,由客户端输入数据,发送给服务器,服务器加上时间后返回给客户端 #!/usr/bin/python 'test TCP server' from socke

  • Python网络编程之TCP与UDP协议套接字用法示例

    本文实例讲述了Python网络编程之TCP与UDP协议套接字用法.分享给大家供大家参考,具体如下: TCP协议 服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) ##创建服务器TCP套接字 tcpSerSoc

  • Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之TCP客户端/服务端功能.分享给大家供大家参考,具体如下: demo.py(TCP客户端): import socket def main(): # 1. 创建tcp的套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 链接服务器 # tcp_socket.connect(("192.168.33.11", 7890)) server_ip = input(

  • Python中的套接字编程是什么?

    Why use Sockets? 套接字是网络的基础.它们使在两个不同程序或设备之间的信息传输成为可能.例如,当您打开浏览器时,您作为客户端正在与服务器建立连接以进行信息传输. 在深入探讨这种通信之前,让我们首先弄清楚这些插座的确切含义. What are Sockets? 一般而言,套接字是为发送和接收数据而构建的内部端点.单个网络将具有两个套接字,每个通信设备或程序一个.这些套接字是IP地址和端口的组合.根据所使用的端口号,单个设备可以具有n个插槽.不同的端口可用于不同类型的协议.请看以下图

  • 浅析Python中的套接字编程

    目录 一.为什么使用套接字 二.什么是套接字 三.如何在Python中实现Socket编程 四.什么是服务器 五.什么是客户端 5.1.Echo Client-Server 5.2.Multiple Communications 六.传输Python对象 6.1.Python pickle模块 6.2.如何使用pickle模块传递python对象结构 一.为什么使用套接字 套接字是网络的基础.它们使在两个不同程序或设备之间的信息传输成为可能.例如,当您打开浏览器时,您作为客户端正在与服务器建立连

  • python粘包问题及socket套接字编程详解

    粘包问题 TCP协议在传输过程中会出现数据粘包问题 讲一下TCP和UDP的区别,都是传数据的协议,没有好坏之说,只是不同的应用需求可能会更好选择哪一个协议 TCP:适合传输数量大 ,需要建立连接,会出现粘包问题,粘包问题可以解决,确定传入的长度,接收同样长度就可以保证一次性传输完 UDP: 适合传输数据量小,没有粘包,不需要连接,一次性传输,下一次就是新的数据,弊端就是数据丢失,不安全 QQ是用什么协议呢?按理应该可以用UDP协议,但是实际用的是TCP协议,这是历史遗留问题,可还记得我们输入QQ

  • python 基于TCP协议的套接字编程详解

    基于TCP协议的套接字编程 实现电话沟通为例,这里传递的是字符,可以自己尝试去发送一个文件 # 服务端 import socket # 1. 符合TCP协议的手机 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # TCP # 2. 绑定手机号 一个服务器,我们自己的电脑作为服务器的话,用自己的IP地址 server.bind(('127.0.0.1',8000)) # 127.0.0.1 代表本地 # server.bind(

  • python使用原始套接字发送二层包(链路层帧)的方法

    发送端代码: #!/usr/bin/python # -*- coding: UTF-8 -*- import socket import struct raw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234)) raw_socket.bind(("eth0", 0)) packet = struct.pack("!6s6sH", "\xff\xff

  • Python中的Numpy 面向数组编程常见操作

    目录 数组编程 简单例子 逻辑条件作为数组操作 数学和统计方法 布尔数组的方法 排序 唯一值和其他的逻辑集合 数组编程 使用Numpy数组可以使你利用简单的数组表达式完成多项数据操作任务,而不需要编写大量的循环,这个极大的帮助了我们高效的解决问题.我们都知道向量化的数组操作比纯Python的等价实现在速度这一方面快很多,至于多少(一到两个数量级)甚至更多,生活需要慢节奏,但是计算就不可以了,掌握高效的计算模型,可以让数据分析如虎添翼! 简单例子 我们生成从-3.14--3.14,按照0.01的间

  • 使用Python中的线程进行网络编程的入门教程

    引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程.进程和异步 I/O 的支持.在许多情况下,通过创建诸如异步.线程和子进程之类的高层模块,Python 简化了各种并发方法的使用.除了标准库之外,还有一些第三方的解决方案,例如 Twisted.Stackless 和进程模块.本文重点关注于使用 Python 的线程,并使用了一些实际的示例进行说明.虽然有许多很好的联机资源详细说明了线程 API,但本文尝试提供一些实际的示例,以说明一些常见的线程使用模式. 全局解释器锁 (G

  • 详解python3中socket套接字的编码问题解决

    一.TCP 1.tcp服务器创建 #创建服务器 from socket import * from time import ctime #导入ctime HOST = '' #任意主机 PORT = 21567 #随机提供个端口号 BUFSIZ = 1024 # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) #分配了 TCP 服务器套接字 tcpSerSo

随机推荐