python套接字编程_Python套接字编程(1)——socket模块与套接字编程

在Python网络编程系列,我们主要学习以下内容:

5. 常见的Python异步编程框架

6. 协程在Python网络编程中的使用

本文介绍Python下的基本套接字编程,主要基于 socket 模块,包括简单的TCP/UDP套接字编程。通过调用 socket 模块的 socket() 函数创建一个新的套接字对象,在创建套接字时需要指定新 socket 对象使用的地址族和套接字类型,下文将分别予以介绍。

地址族(Address Family)

地址族通常作为 socket() 函数的第一个参数, AF_UNIX 只用于类UNIX平台,如果前者没有被定义,那么该协议对应的地址族都不可用。

socket.AF_UNIX   属于该类型的地址就是一个字符串。AF_UNIX对应的数值是:1。

socket.AF_INET   IPv4地址族,(host, port) 形式的二元组,host是一个表示网络主机的字符串,port为套接字的端口号。AF_INET对应的数值是:2。

socket.AF_INET6   (host, port, flowinfo, scopeid) 形式的四元组。AF_INET6对应的数值是:23。

套接字类型(Type)

套接字类型用于 socket() 函数的第二个参数,但是只有 SOCK_STREAM (TCP)和 SOCK_DGRAM (UDP)是比较常见的。

socket.SOCK_STREAM   面向流(TCP连接)的套接字,对应的数值:1。

socket.SOCK_DGRAM   面向数据报(UDP连接)的套接字,对应的数值:2。

socket.SOCK_RAW   对应的数值:3。

socket.SOCK_RDM   对应的数值:4。

socket.SOCK_SEQPACKET   对应的数值:5。

Socket 对象的只读属性

Python的socket对象具有以下属性:

socket.family   创建套接字时传入的地址族参数,访问该属性获得的是数值。

socket.type   创建套接字时传入的套接字类型,访问该属性获得的是数值。

socket.proto

Socket对象及套接字编程

创建套接字

socket.socket([family[, type[, proto]]])

socket() 函数创建一个新的套接字对象;

参数:

family——套接字对象使用的地址族,可选值:AF_INET——IPv4地址族,AF_INET6——IPv6地址族,AF_UNIX——针对类UNIX系统的套接字;

type——套接字对象的类型,可选值:SOCK_STREAM——TCP连接套接字,SOCK_DGRAM——UDP数据报套接字;

proto——协议数通常是0,一般可以忽略该参数。

返回:一个新的套接字对象。

*注意:

关于地址族的问题,目前最流行的仍然是IPv4地址族,所以本文基本针对IPv4地址族展开。在Python的套接字编程中,IPv4地址是 (hostname, port) 形式的二元组,其中hostname是一个字符串,内容是网络主机的DNS域名或点分IP地址(如:'8.8.8.8');port 是一个整数,代表远端目标 socket 监听的端口。

查看套接字的文件描述符(fd)

socket.fileno()

返回调用该方法的 socket 对象的 fd,fd 可以用于 select() 等机制。在Linux中一切皆文件,套接字也不例外,每个套接字都有自己的文件描述符,调用 fileno() 可以查看对应 socket 对象的描述符。

Windows 下返回的这个值不能用于类似 os.fdopen() 这样直接操作 fd 的函数,但是在 UNIX/Linux 系统上没有这个限制。

绑定套接字

socket.bind(address)

bind() 将套接字绑定到一个地址上,前提是该socket对象尚未被绑定到某个地址;

参数:符合创建该套接字时声明的地址族格式的地址;对于AF_INET而言,如果(host, port)中的host是 "" 即空字符串,则说明允许来自一切主机的连接。

返回值:试图绑定一个已经绑定的套接字将抛出 socket.error 。正常调用时返回值为空。

套接字监听连接

socket.listen(backlog)

listen() 只由服务端 socket 调用,监听连接到该套接字上的连接。

参数 backlog 指定该套接字可以容纳的最大连接数,至少是0;

listen() 返回值为空。

阻塞等待连接

socket.accept()

accept() 等待并接受一个连接,能够调用该方法的套接字必须(1). 已经绑定到一个特定的地址,并且(2). 监听连接。如果没有客户端连接,则 accept() 函数阻塞直到有客户端发起连接。

返回值: (conn, addr) 形式的二元组,其中:

conn :一个新的套接字对象,这个套接字对象已经连接,可以用来收发消息。

addr :连接到本套接字上来的套接字对象的网络地址,在IPv4地址族下,这是一个(host, port) 形式的二元组。

*注意ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值