当前位置: 首页 > 后端技术 > Python

Python网络编程

时间:2023-03-25 20:30:39 Python

Python提供了两个层次的网络服务访问:底层网络服务支持基本的Socket,它提供了标准的BSDSocketsAPI,可以访问底层操作系统Socket接口的所有方法。高级网络服务模块SocketServer,提供以服务器为中心的类,可以简化网络服务器的开发。什么是套接字?套接字也叫“套接字”。应用程序通常通过“套接字”向网络发送请求或响应网络请求,以便计算机上的主机或进程进行通信。socket()函数在Python中,我们使用socket()函数来创建套接字。语法如下:socket.socket([family[,type[,proto]]])参数family:socketfamily可以是AF_UNIX或AF_INET。type:socket类型根据是面向连接还是无连接分为SOCK_STREAM或SOCK_DGRAM。protocol:一般不填,默认为0。Socket对象(内置)方法函数说明服务器端sockets.bind()绑定地址(主机,端口)到套接字,在AF_INET下,地址以元组(主机,端口)的形式表示。s.listen()开始TCP侦听。backlog指定操作系统在拒绝连接之前可以挂起的最大连接数。该值应至少为1,对于大多数应用程序而言,5就足够了。s.accept()被动接受TCP客户端连接,(阻塞)等待连接客户端socket的到来s.connect()主动初始化TCP服务器连接。通常,地址的格式是一个元组(主机名,端口)。如果连接出错,将返回socket.error。s.connect_ex()connect()函数的扩展版本,发生错误时返回错误代码,而不是抛出异常。公用socket函数s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定接收到的最大数据量。标志提供有关消息的附加信息,通常可以忽略。s.send()发送TCP数据,将数据以字符串形式发送到连接的套接字。返回值是要发送的字节数,可能小于字符串的字节数。s.sendall()完整发送TCP数据。将字符串中的数据发送到连接的套接字,但会在返回之前尝试发送所有数据。成功返回None,失败则抛出异常。s.recvfrom()接收UDP数据,与recv()类似,但返回值为(data,address)。其中data是包含接收到的数据的字符串,address是发送数据的套接字的地址。s.sendto()发送UDP数据,将数据发送到socket,address是(ipaddr,port)形式的元组,指定远程地址。返回值是发送的字节数。s.close()关闭套接字s.getpeername()返回已连接套接字的远程地址。返回值通常是一个元组(ipaddr,port)。s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)s.setsockopt(level,optname,value)设置给定套接字选项的值。s.getsockopt(level,optname[.buflen])返回套接字选项的值。s.settimeout(timeout)设置socket操作的超时时间,timeout是一个浮点数,单位是秒。None值表示没有超时期限。一般在socket刚创建的时候就应该设置超时时间,因为它们可能会被用于连接操作(比如connect())s.gettimeout()返回当前超时时间的值,单位是秒,如果没有超时时间已设置,返回无。s.fileno()返回套接字的文件描述符。s.setblocking(flag)如果flag为0,则将套接字设置为非阻塞模式,否则将套接字设置为阻塞模式(默认值)。在非阻塞模式下,如果recv()调用没有找到任何数据,或者send()调用不能立即发送数据,将导致socket.error异常。s.makefile()创建与套接字服务器关联的文件的简单实例我们使用套接字模块的套接字函数来创建套接字对象。套接字对象可以通过调用其他函数来建立套接字服务。现在我们可以通过调用bind(hostname,port)函数来指定服务的端口。接下来,我们调用套接字对象的accept方法。该方法等待来自客户端的连接,并返回一个连接对象,表示客户端已经连接。完整代码如下:示例#!/usr/bin/python#-*-编码:UTF-8-*-#文件名:server.pyimportsocket#导入socket模块s=socket.socket()#创建socketobjecthost=socket.gethostname()#获取本地主机名port=12345#设置端口s.bind((host,port))#绑定端口s.listen(5)#等待客户端连接whileTrue:c,addr=s.accept()#建立客户端连接print'连接地址:',addrc.send('欢迎来到菜鸟教程!')c.close()#关闭客户端连接接下来我们写一个到上面创建的服务的简单客户端实例连接。端口号是12345。socket.connect(hosname,port)方法使用主机名和端口端口打开到服务器的TCP连接。连接后,我们就可以从服务器获取数据了。请记住,操作完成后需要关闭连接。完整代码如下:示例#!/usr/bin/python#-*-编码:UTF-8-*-#文件名:client.pyimportsocket#导入socket模块s=socket.socket()#创建socketobjecthost=socket.gethostname()#获取本地主机名port=12345#设置端口号s.connect((host,port))prints.recv(1024)s.close()现在我们打开两个终端,第一个终端执行server.py文件:$pythonserver.py第二个终端执行client.py文件:$pythonclient.py欢迎来到菜鸟教程!这时候我们再打开第一个终端,会看到输出如下信息:Connectionaddress:('192.168.0.118',62461)