以前也学过套接字编程,这次想系统全面的学习下python网络编程的使用。做这个,为检测进度,也为后续留下笔记和足迹。
socket 常用函数
- 获取主机名和主机地址
socket.gethostname()
socket.gethostbyname()
import socket
host = socket.gethostname()
ip = socket.gethostbyname(host)
# 还能够解析出外部服务的ip
ip = socket.gethostbyname('www.baidu.com')
- 互转ipv4地址称32位二进制
socket.inet_aton()
socket.inet_ntoa()
import socket
socket.inet_aton('127.0.0.1')
socket.inet_ntoa('\x7f\x00\x00\x01')
- 指定端口和协议找服务名称
socket.getservbyport()
import socket
# 找一下http和https的服务,如没有回返回notfound错误
socket.getservbyport(80, 'tcp')
socket.getservbyport(443, 'tcp')
- 互转主机字节序和网络字节序
socket.ntohl()/socket.ntohs()
socket.htonl()/socket.htons()
- 套接字超时时间
socket.gettimeout()
socket.settimeout()
import socket
# 设置一个套接字对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 超时时间默认为空
sock.settimeout(100)
sock.gettimeout()
- 套接字异常
socket.error() 一般异常
socket.gaierror() 地址异常
socket.timeout() 超时异常
- 修改套接字缓冲区
socket.getsockopt()
socket.setsockopt()
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 查询缓冲大小
sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
# 设置大小
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2048)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2048)
# 设置重用套接字
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- 设置套接字阻塞模式
非阻塞:套接字遇到异常就抛错误socket.setblocking(0)
阻塞:遇到错误不会阻止操作socket.setblocking(1)
- 获取网络时间服务器时间(NTP proctol)
import ntplib
import time
ntp = ntplib.NTPClient()
res = ntp.request('pool.ntp.org')
print time.ctime(res.tx_time)
练习套接字 客户端/服务端 简单通信
服务端
import socket
# 初始化一个套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置套接字可重用
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定套接字
sock.bind(('localhost', 8888))
# 监听客户端链接,最大数目为5
sock.listen(5)
while True:
# 阻塞,接收
client, add = sock.accept()
data = client.recv(2048)
print "data:", data, '\n', 'host:', add, '\n'
# 关闭
client.close
客户端
import socket两个终端通信
# 初始化一个套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 链接服务端
sock.connect(('localhost', 8888))
try:
# 发送数据
sock.sendall("From client socket!")
except socket.error, e:
print "error!"
finally:
# 关闭
sock.close()
服务端
duck@duck:~/sockdir/chapter_1$ python sersock.py客户端
data: From client socket!
host: ('127.0.0.1', 53910)
duck@duck:~/sockdir/chapter_1$ python clisock.py