python网络编程应用(一)
在之前的一篇博客《python网络编程基础》中介绍了socket.socket()函数及其应用,其实socket模块中还有很多属性可供网络应用程序使用。这里将详细讲解一下socket模块中一些常用到的函数/属性。
1. socket模块属性
下面列出了一些常用的socket模块属性。(引用自《python核心编程》)

更详细的函数说明,请看python官方文档中的socket模块:https://docs.python.org/2/library/socket.html
2. 实际应用中的实例分析
2.1 打印设备名和IPV4地址
函数原型: socket.gethostname() 和 socket.gethostbyname(hostname) 。也可以使用socket.getfqdn() 返回完整的域名字。
host_name = socket.gethostname() # 获取设备名 ip_addr = socket.gethostbyname(host_name) # 获取本机IP remote_host = 'www.python.org'
ip_addr = socket.gethostbyname(remote_host) # 获取远程主机的IP
2.2 打印本地网络接口的IPV4地址
import socket, fcntl, struct ifname = "eth0" s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
inet = fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))
ret = socket.inet_ntoa(inet[20:24])
print ret
2.3 IPV4地址格式转换
函数原型:socket.inet_aton(ip_string) 和socket.inet_ntoa(packed_ip) 。 如果需要ipv6支持,就需要使用inet_pton()/inet_ntop()函数。
from binascii import hexlify # 以十六进制形式表示二进制数据 ip_addr = '192.168.1.15'
packed_ip_addr = socket.inet_aton(ip_addr) # 将字符串形式的IP地址转换成32位二进制格式
unpacked_ip_addr = socket.inet_ntoa(packed_ip_addr) # 与上面相反
print "IP Address: %s" % ip_addr
print "Packed: %s" % hexlify(packed_ip_addr)
print "Unpacked: %s" % unpacked_ip_addr
2.4 通过指定端口和协议找服务名
函数原型: socket.getservbyname(servicename[, protocolname]) 和 socket.getservbyport(port[, protocolname]) 。协议名可以省略,默认是找所有的协议,如需指定,只能是‘tcp’或者‘udp’。
serverport = socket.getservbyname('http','tcp')
servername = socket.getservbyport(80,'tcp')
2.5 主机字节序与网络字节序之间的转换
data = 1234 # 32-bit
print "Original: %s => Long host byte: %s => Network byte: %s" % (data,socket.ntohl(data),socket.htonl(data)
# 16-bit
print "Original: %s => Short host byte: %s => Network byte: %s" % (data,socket.ntohs(data),socket.htons(data)
## 函数名中的n表示网络; h表示主机; l表示长整型; s表示短整型,即16位。
2.6 设置套接字超时
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(100)
print s.gettimeout()
2.7 设置缓冲区大小
setsockopt()方法接收三个参数:level、optname和value。其中,optname是选项名,value是该选项名的值。value所用的符号常量(SO_*等)可以在socket模块中查看。
import socket s_buf = 1024
r_buf = 1024 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
bufsize = sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
print "bufsize [Before]: %d" % bufsize sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF,s_buf)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF,r_buf)
bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
print "bufsize [After]: %d" % bufsize
2.8 设置套接字(非)阻塞模式
默认情况下,TCP套接字是处于阻塞模式下的。这种模式会使操作效率低下,如果两个程序最后都在等待对方发送或者接收数据,就有可能导致死锁。调用setblocking()方法可以改变套接字的阻塞标志。默认值为1,表示会阻塞。传入值为0时则关闭阻塞。如果套接字为非阻塞,并且没有为处理操作做好准备,就会产生一个socket.error。解决的方法是设置一个超时值。
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setblocking(1)
s.settimeout(0.5)
s.bind(('127.0.0.1',0))
socket_addr = s.getsockname()
print str(socket_addr)
while 1:
s.listen(1)
2.9 地址重用
当连接有意或无意关闭后,如果想再在这个端口上运行套接字服务端就会抛出一个"Address alreadly in use"异常。解决的方法是启用套接字重用选项SO_REUSEADDR。
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
s.bind((bind_ip, bind_port))
s.listen(5)
...
2.10 处理套接字错误
在socket套接字使用过程中,很可能会出现很多错误,可以使用try-except语句处理异常。
# First try-except block
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
print "Error creating socket: %s" % e # Second try-except block
try:
s.connect((host, port))
except socket.gaierror, e:
print "Address-related error connecting to server: %s" % e
sys.exit(1)
except socket.error, e:
print "Connection error: %s" % e
sys.exit(1) # Third try-except block
try:
s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename)
except socket.error, e:
print "Error sending data: %s" % e
sys.exit(1) while 1:
# Fourth try-except block
try:
buf = s.recv(1024)
except socket.error, e:
print "Error receiving data: %s" % e
sys.exit(1)
python网络编程应用(一)的更多相关文章
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- Python 网络编程(一)
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- python网络编程-01
python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...
- 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档
Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...
- Python网络编程基础pdf
Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...
- python 网络编程(Socket)
# from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- 自学Python之路-Python网络编程
自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3
随机推荐
- WAL 【转】
重做日志:每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志.这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改 撤消日志:当一些更改在执行一半时,发生意外, ...
- 常用的SQL语句(牢记)
上课时的重要内容,其中表 t_hq, t_hq2, 以及字段的名字是举例说明. update t_hq t set t.bumendh = '10086';commit;全表更新电话,commit是提 ...
- 38. Count and Say (String; DP)
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- Metropolis(多源点最短路)
Metropolis https://www.nowcoder.com/acm/contest/203/I 题目描述 魔方国有n座城市,编号为.城市之间通过n-1条无向道路连接,形成一个树形结构. 在 ...
- TZOJ 4746 Xiangqi(模拟棋盘数组)
描述 Xiangqi is one of the most popular two-player board games in China. The game represents a battle ...
- 【校招面试 之 剑指offer】第11题 旋转数组中的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 9-n个人中选k个人的选择方法种类
用递归法计算从n个人中选择k个人组成一个委员会的不同组合数分析: 1.如果k>n,结果为0 2.k=n时,只有1组 3.k<n的时候,可以把解空间分为两部分:假设其中一个人叫X,那么选X的 ...
- php Pthread 多线程 (五) 线程同步
有些时候我们不希望线程调用start()后就立刻执行,在处理完我们的业务逻辑后在需要的时候让线程执行. <?php class Sync extends Thread { private $na ...
- Golang实现一个密码生成器
小地鼠防止有人偷他的果实,在家里上了一把锁.这个锁怎么来的呢?请往下看.. package main import ( "flag" "fmt" "m ...
- HDFS高可用性及其分布式系统思想基础
源自单点失效问题,也就是当NameNode不可用的时候,用什么办法可以平滑过渡? 最直接的办法是再添加一个备用的NN,这就产生了Active NameNode和Standby NameNode的设计思 ...