网络编程
套接字地址:主机与端口
合法的端口号范围为 0 到 65535。其中,小于 1024 的端口号为系统保留端口。
面向连接与无连接
面向连接 TCP/IP
实现这种连接的主要协议就是传输控制协议(即 TCP)。要创建 TCP 套接字就得在创建的时候, 指定套接字类型为 SOCK_STREAM。TCP 套接字采用 SOCK_STREAM 这个名字,表达了它做为流套接字的 特点
和UDP
实现这种连接的主要协议就是用户数据报协议(即 UDP)。要创建 UDP 套接字就得在创建的时候, 指定套接字类型为 SOCK_DGRAM。
Python 中的网络编程
socket()模块函数
语法:
socket(socket_family, socket_type, protocol=0)
socket_family
可以是 AF_UNIX
或 AF_INET
。socket_type
可以是 SOCK_STREAM
或 SOCK_DGRAM
。
套接字对象(内建)方法
服务器端套接字函数
函数 | 描述 |
---|---|
s.bind() | 绑定地址(主机,端口号对)到套接字 |
s.listen() | 开始TCP监听 |
s.accept() | 被动接受 TCP 客户的连接,(阻塞式)等待连接的到来 |
客户端套接字函数
函数 | 描述 |
---|---|
s.connect() | 主动初始化 TCP 服务器连接 |
s.connect_ex() | connect()函数的扩展版本,出错时返回出错码,而不是抛异常 |
公共用途的套接字函数
函数 | 描述 |
---|---|
s.recv() | 接受TCP数据 |
s.send() | 发送TCP数据 |
s.sendall() | 完整发送TCP数据 |
s.recvfrom() | 接受UDP数据 |
s.sendto() | 发送UDP数据 |
s.getpeername() | 连接到当前套接字的远端的地址 |
s.getsockname() | 当前套接字的地址 |
s.getsockopt() | 返回指定套接字的参数 |
s.setsockopt() | 设置指定套接字的参数 |
s.close() | 关闭套接字 |
Blocking-Oriented Socket Methods
函数 | 描述 |
---|---|
s.setblocking() | 设置套接字的阻塞与非阻塞模式 |
s.settimeout() | 设置阻塞套接字操作的超时时间 |
s.gettimeout() | 得到阻塞套接字操作的超时时间 |
面向文件的套接字的函数
函数 | 描述 |
---|---|
s.fileno() | 套接字的文件描述符 |
s.makefile() | 创建一个与该套接字关连的文件 |
创建一个 UDP 服务器和客户端
服务器端代码:
# coding=utf-8
from socket import *
import traceback
host = ''
port = 12345
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)
while 1:
try:
clientsock, clientaddr = s.accept()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue
try:
print "连接来自:", clientsock.getpeername()
while 1:
data = clientsock.recv(4096)
if not len(data):
break
print clientsock.getpeername()[0] + ':' + str(data)
clientsock.sendall(data)
clientsock.sendall("\nI get it!\n")
t = raw_input('input the word:')
clientsock.sendall(t)
except (KeyboardInterrupt, SystemExit):
raise
except:
traceback.print_exc()
try:
clientsock.close()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
客户端代码:
# coding=utf-8
import socket, sys
port = 12345
host = raw_input('输入服务器ip:')
data = raw_input('输入要发送的信息:')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, port))
except:
print '连接错误!'
s.send(data)
s.shutdown(1)
print '发送完成。'
while 1:
buf = s.recv(4096)
if not len(buf):
break
sys.stdout.write(buf)
套接字模块属性
数据属性
属性名字 | 描述 |
---|---|
AF_UNIX, AF_INET, AF_INET6 | Python 支持的套接字家族 |
SO_STREAM, SO_DGRAM | 套接字类型 (TCP = 流, UDP = 数据报) |
has_ipv6 | 表示是否支持 IPv6 的标志变量 |
异常
属性名字 | 描述 |
---|---|
error | 套接字相关错误 |
herror | 主机和地址相关的错误 |
gaierror | 地址相关的错误 |
timeout | 超时 |
函数
属性名字 | 描述 |
---|---|
socket() | 用指定的地址家族,套接字类型和协议类型(可选)创建一个套接字对象 |
socketpair() | 用指定的地址家族,套接字类型和协议类型(可选)创建一对套接字对象 |
fromfd() | 用一个已经打开的文件描述符创建一个套接字对象 |
数据属性
属性名字 | 描述 |
---|---|
ssl() | 在套接字初始化一个安全套接字层(SSL)。不做证书验证。 |
getaddrinfo() | 得到地址信息 |
getfqdn() | 返回完整的域的名字 |
gethostname() | 得到当前主机名 |
gethostbyname() | 由主机名得到对应的 ip 地址 |
gethostbyname_ex() | gethostbyname()的扩展版本,返回主机名,主机所有的别名和IP地址列表。 |
gethostbyaddr() | 由 IP 地址得到 DNS 信息,返回一个类似gethostbyname_ex()的3元组。 |
getprotobyname() | 由协议名(如’tcp’)得到对应的号码。 |
getservbyname()/getservbyport() | 由服务名得到对应的端口号或相反,两个函数中,协议名都是可选的。 |
ntohl()/ntohs() | 把一个整数由网络字节序转为主机字节序 |
htonl()/htons() | 把一个整数由主机字节序转为网络字节序 |
inet_aton()/inet_ntoa() | 把 IP 地址转为 32 位整型,以及反向函数。(仅对 IPv4 地址有效) |
inet_pton()/inet_ntop() | 把 IP 地址转为二进制格式以及反向函数。(仅对 IPv4 地址有效) |
getdefaulttimeout()/setdefaulttimeout() | 得到/设置默认的套接字超时时间,单位秒(浮点数) |
网络客户端编程
ftplib.FTP 类方法
函数 | 操作 |
---|---|
login(user='anonymous', passwd='', acct='') | 登录到 FTP 服务器,所有的参数都是可选的 |
pwd() | 得到当前工作目录 |
cwd(path) | 把当前工作目录设置为 path |
dir([path[,...[,cb]]) | 显示 path 目录里的内容,可选的参数 cb 是一个回调函数,它 会被传给 retrlines()方法 |
nlst([path[,...]) | 与 dir()类似,但返回一个文件名的列表,而不是显示这些文 件名 |
retrlines(cmd [, cb]) | 给定 FTP 命令(如“RETR filename”),用于下载文本文件。 可选的回调函数 cb 用于处理文件的每一行 |
retrbinary(cmd, cb[,bs=8192[, ra]]) | 与 retrlines()类似,只是这个指令处理二进制文件。回调函 数 cb 用于处理每一块(块大小默认为 8K)下载的数据。 |
storlines(cmd, f) | 给定 FTP 命令(如“STOR filename”),以上传文本文件。要 给定一个文件对象 f |
storbinary(cmd, f[,bs=8192]) | 与 storlines()类似,只是这个指令处理二进制文件。要给定 一个文件对象 f,上传块大小 bs 默认为 8Kbs=8192]) |
rename(old, new) | 把远程文件 old 改名为 new |
delete(path) | 删除位于 path 的远程文件 |
mkd(directory) | 创建远程目录 |
rmd(directory) | 删除远程目录 |
quit() | 关闭连接并退出 |
参考资料:
Python核心编程
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/54612912
作者:WSYW126