目录
一、网络服务概述
Python提供了两个级别访问的网络服务,其一是低级别的网络服务支持基本的Socket,它提供了标准的BSD Sockets API,可以访问底层操作系统Socket接口的全部方法;高级别的网络服务模块SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。
Socket又称为“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台主机上的进程间可以通讯。
二、socket函数
2.1 在python中,使用socket() 函数来创建套接字,语法格式如下
socket.socket([family[, type[, proto]]])
family: 套接字家族,可以是AF_UNIX 或者是AF_INET
type: 套接字类型,可根据面向连接的还是非连接的分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填,默认为0
2.2 socket 套接字对象中常用的方法和属性
2.2.1 服务器端套接字方法
方法名称 | 方法描述 |
s.bind() | 将地址(主机名,端口号)绑定在套接字上 |
s.listen() | 设置并启动TCP监听器 |
s.accept() | 被动接受TCP客户端连接,一直等待直到连接到达(阻塞) |
2.2.2 客户端套接字方法
方法名称 | 方法描述 |
s.connect() | 主动发起TCP服务器连接 |
s.connect_ex() | connect()的扩展版本,此时会以错误码的形式返回,而不是一个异常抛出 |
2.2.3 普通的套接字方法
方法名称 | 方法描述 |
s.recv() | 接收TCP消息 |
s.recv_into() | 接收TCP消息到指定的缓冲区 |
s.send() | 发送TCP消息 |
s.sendall() | 完整发送TCP消息 |
s.recvfrom() | 接收UDP消息 |
s.recvfrom_into() | 接收UDP消息到指定的缓冲区 |
s.sendto() | 发送UDP消息 |
s.getpeername() | 连接到套接字(TCP)的远程地址 |
s.getsockname() | 当前套接字的地址 |
s.setsockopt() | 设置给定套接字选项的值 |
s.getsockopt() | 返回给指定套接字选项的值 |
s.shutdown() | 关闭连接 |
s.close() | 关闭套接字 |
s.detach() | 在未关闭文件描述符的情况下关闭套接字,返回文件描述符 |
s.ioctl() | 控制套接字的模式(仅支持windowns) |
2.2.4 面向阻塞的套接字方法
方法名称 | 方法描述 |
s.setblocking() | 设置套接字的阻塞式或非阻塞式 |
s.settimeout() | 设置阻塞套接字操作的超时时间 |
s.gettimeout() | 获取阻塞套接字操作的超时时间 |
2.2.5 面向文件的套接字方法
方法名称 | 方法描述 |
s.fileno() | 套接字的文件描述符 |
s.makefile() | 创建与套接字关联的文件对象 |
2.2.6 数据属性
属性名称 | 属性描述 |
s.family | 套接字家族 |
s.type | 套接字类型 |
s.proto | 套接字协议 |
三、简单示例
3.1 服务器端
使用socket模块的socket函数来创建一个socket对象,socket对象可以通过调用其它函数来设置一个socket服务,此外通过调用bind(hostname,port)函数来指定服务的port(端口),接着调用socket对象的accept方法,该方法等待客户端的连接,并返回connection对象,表示已连接到客户端。
import socket
import sys
#创建socket对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#获取本地主机名
host = socket.gethostname()
port = 9999
#绑定端口号
serversocket.bind((host, port))
#设置最大连接数,超过后排队
serversocket.listen(5)
while True:
#建立客户端连接
clientsocket, addr = serversocket.accept()
print("连接地址: %s" % str(addr))
msg = "Python基础练习!" + "\r\n"
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()
3.2 客户端
客户端示例连接以上创建的服务,端口号为9999,socket.connect(hostname, port)方法打开一个TCP连接到主机为hostname端口号为port的服务器,连接后我们就可以从服务端获取数据,另外要记住的是,操作完成后需要关闭连接。
import socket
import sys
#创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#获取本地主机名和设置端口号
host = socket.gethostname()
port = 9999
#连接服务,指定主机和端口
s.connect((host, port))
#接收小于1024字节的数据
msg = s.recv(1024)
s.close()
print(msg.decode('utf-8'))