python 标准库模块socket(五-网络)

Python 标准库

Python语言参考 描述了 Python 语言的具体语法和语义,这份库参考则介绍了与 Python 一同发行的标准库。它还描述了通常包含在 Python 发行版中的一些可选组件。

Python 标准库非常庞大,所提供的组件涉及范围十分广泛,正如以下内容目录所显示的。这个库包含了多个内置模块 (以 C 编写),Python 程序员必须依靠它们来实现系统级功能,

例如文件 I/O,此外还有大量以 Python 编写的模块,提供了日常编程中许多问题的标准解决方案。其中有些模块经过专门设计,通过将特定平台功能抽象化为平台中立的 API 来鼓励和加强 Python 程序的可移植性。

Windows 版本的 Python 安装程序通常包含整个标准库,往往还包含许多额外组件。对于类 Unix 操作系统,Python 通常会分成一系列的软件包,因此可能需要使用操作系统所提供的包管理工具来获取部分或全部可选组件。

在这个标准库以外还存在成千上万并且不断增加的其他组件 (从单独的程序、模块、软件包直到完整的应用开发框架),访问 Python 包索引 即可获取这些第三方包。

官方文档(标准库)https://docs.python.org/zh-cn/3.7/library/index.html

socket模块

  网络和进程间通信--底层网络接口

  https://docs.python.org/zh-cn/3/library/socket.html#module-socket

In [2]: import socket  #

In [4]: socket.gethostname()  #获取当前主机名称
Out[4]: 'DESKTOP-SPLE7HF'

In [5]: socket.gethostbyname("localhost")  #
Out[5]: '127.0.0.1'

In [6]: socket.gethostbyname("DESKTOP-SPLE7HF") # 通过主机名称获取对应的IP地址
Out[6]: '192.168.22.1'

socket对象的方法

一、用于TCP

  1、socket()

    作用:创建套接字对象

    返回值:返回创建的套接字对象

from socket import *
# 1、创建套接字对象
sock = socket(family = AF_INET,type = SOCK_STREAM,proto = 0)

  2、bind(address)

    参数:address,本地地址,(IP,PORT)

    作用:将套接字绑定到本地address

# 2、绑定地址
sock.bind(("127.0.0.1",8989))

  3、listen()

    参数:允许服务器连接的客户端的数量

# 3、设置监听
sock.listen(5)

  4、accept()

    参数:对IP套接字,是一个元组(IP,PORT)# 远程IP和其端口

    作用:等待传入连接

    返回值:返回一个元组,(套接字,地址)# 已连接对象的套接字,已连接对象的地址 

#4、等待连接
print("等待客户端连接...")
connd,addr = sock.accept()
print("已有客户端连接:",addr)

  5、recv(buffersize)

    参数:buffersize ,必选,一次最多从套接字接收buffersize个字节的数据

    特征

      【1】 如果连接的另一端断开连接,则recv立即返回空子串

      【2】 recv是从接受缓冲区取出内容,当缓冲区为空则阻塞

      【3】 recv如果一次接受不完缓冲区内容,下次会继续接收

    返回值:返回接收到的数据,字节串格式

data = sock.recv(1024)
print("收到服务器回复的消息:",data.decode())

  6、send(data)

    参数:data,必须为字节串,两种选择方式

         ① 字节串格式,eg: data=b"hello world"   # 此时,只能为ASCII编码

         ② 字符串格式,再进行编码转换为字节串,eg:data=“北京欢迎你”.encode()

    特征

      【1】 如果发送的另外一段不存在则会产生Pipe Broken

      【2】 recv是向发送缓冲区发送内容,当缓冲区为满阻塞  

    返回值:返回已发送的字节数

# sed = connd.send("The server accepted your msg.".encode()) # 【1】
sed = connd.send(b"The server accepted your msg.") #【2】

  7、sendall(data)

    参数 : 同send 

    功能 : tcp套接字发送消息 

    返回值:如果发送成功返回None

          ------------------------------------------

  8、connect(address)

    参数:address,是一个元组。(ip,端口)

    作用:将套接字连接到远程地址   

#2 、发起连接
sock.connect(("127.0.0.1",8989))

  9、close()

    关闭套接字对象

二、用于UDP

  1、socket()

    sock = socket(AF_INET,SOCK_DGRAM)

  2、bind()

  3、recvfrom()

    data,addr = sockfd.recvfrom(buffersize)

    参数: 每次最多接受消息的大小 ,字节

    功能: 接受UDP消息 

    返回值:一个元组(data,addr)

        data 接收到的内容 ,

        addr 消息发送方的地址

    recvfrom每次接收一个报文,如果没有接收完全则丢弃没有收到的内容

  4、sendto()

    sockfd.sendto(data,addr)

    参数: data 要发送的内容 ,bytes

    功能: UDP消息发送 。 addr ,目标地址 

    返回:已发送的字节数

  5、close()

三、用于UDP--广播

  https://www.cnblogs.com/longyuu/p/14229030.html

  【接收端】

    【1】创建数据报套接字

        s = socket(AF_INET,SOCK_DGRAM)

    【2】设置套接字可以接收广播

        s.setsockopt(SOL_SOCKET,SO_BROADCAST,1)

    【3】绑定端口

        s.bind(('',9999))

    【4】消息接收

        msg,addr = s.recvfrom(1024)

    【5】关闭套接字

  【发送端】

    【1】设置广播地址 "<broadcast>"

         dest = ('172.60.50.255',9999)

    【2】创建数据报套接字对象

         s = socket(AF_INET,SOCK_DGRAM)

    【3】设置套接字对象能够发送广播

         s.setsockopt(SOL_SOCKET,SO_BROADCAST,1)

    【4】发送广播

         s.sendto("今日多云".encode(),dest)

    【5】关闭套接字

 

         s.close()

 

四、套接字的其它属性和方法

  s表示套接字对象

  【1】属性

      ① s.type 

        返回表示套接字类型

      ② s.family

        返回地址类型

  【2】方法

      ① s.fileno()

        功能 : 获取套接字的文件描述符

        文件描述符 : 每一个IO事件操作系统都会分配一个不同的正整数与之匹配,

                该整数即为此IO的文件描述符

      ② s.getsockname()

        功能 : 获取套接字绑定的地址

      ③ s.getpeername()

        功能 : 获取连接套接字客户端的地址

      ④ s.setsockopt(level,optname,value)

        参数 : level ,设置选项的类型 SOL_SOCKET。 optname 子类选项 。value 要设置的值

        功能 : 设置套接字选项 

      ⑤ s.getsockopt(level,optname)

        参数 : level ,要获取选项的类型 SOL_SOCKET。 optname 子类选项 

        功能 : 获取套接字选项值

        返回值 : 获取的setsockopt设置的value值

 

from socket import *
s = socket()

#设置端口可立即重用
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
print("getsockopt==>",s.getsockopt(SOL_SOCKET,SO_REUSEADDR))

#获取套接字类型
print("type==>",s.type)

#获取地址类型
print("famliy==>",s.family)

#文件描述符
print("fileno==>",s.fileno())

#绑定地址
s.bind(('192.168.1.4',9999))
#获取套接字绑定的地址
print("getsockname==>",s.getsockname())

s.listen(5)
#等待连接
c,addr = s.accept()

#获取连接的套接字的客户端地址
print("getpeername==>",c.getpeername())
print("addr:",addr)

data = c.recv(1024)
print("接收到的数据:",data)

c.close()
s.close()

 

#结果
getsockopt==> 1
type==> SocketKind.SOCK_STREAM
famliy==> AddressFamily.AF_INET
fileno==> 464
getsockname==> ('192.168.1.4', 9999)
getpeername==> ('192.168.1.4', 56304)
addr: ('192.168.1.4', 56304)
接收到的数据: b'7879'

 

 

 

posted @ 2021-01-03 17:36  昱成  阅读(402)  评论(0编辑  收藏  举报