好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

软件编程思想-16.ppt

28页
  • 卖家[上传人]:tian****1990
  • 文档编号:74661409
  • 上传时间:2019-01-29
  • 文档格式:PPT
  • 文档大小:510KB
  • / 28 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第十六章 网络编程,√ 引言:客户/服务器架构 √ 套接字:通信终点 √ 面向连接与无连接套接字 √ Python 中的网络编程 √ Socket 模块 √ 套接字对象方法 √ TCP/IP 客户端和服务器 √ UDP/IP 客户端和服务器 √ SocketServer 模块 √ Twisted 框架介绍,,客户/服务器架构,,,,客户/服务器网络编程 1.服务程序, 监听请求 2.客户端,提出服务请求,,套接字:通讯端点 70 年代,伯克利分校版本的 BSD UNIX 基于文件 基于网络 AF_UNIX,AF_NETLINK,和AF_INET,,套接字地址:主机与端口 主机:服务器 端口:服务 合法的端口号范围为0 到65535其中,小于1024 的端口号为系统保留端口,,面向连接 “虚电路”或“流套接字”:在通讯之 前建立一条连接 传输控制协议(TCP):顺序的,可靠的,不会重复的数据传输 套接字类型:SOCK_STREAM,,无连接 无需建立连接就可以进行通讯 无法保证数据到达的顺序,可靠性及数据不重复性. 用户数据报协议(UDP) 套接字类型: SOCK_DGRAM,,socket()模块函数 socket(socket_family, socket_type, protocol=0) socket_family: AF_UNIX AF_INET socket_type :SOCK_STREAM SOCK_DGRAM tcpSock = socket(AF_INET, SOCK_STREAM) udpSock = socket.socket(socket.AF_INET, socket.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()a 设置阻塞套接字操作的超时时间 s.gettimeout()a 得到阻塞套接字操作的超时时间 面向文件的套接字的函数 s.fileno() 套接字的文件描述符 s.makefile() 创建一个与该套接字关连的文件,,ss = socket() # 创建服务器套接字 ss.bind() # 把地址绑定到套接字上 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户的连接 comm_loop: # 通讯循环 cs.recv()/cs.send() # 对话(接收与发送) cs.close() # 关闭客户套接字 ss.close() # 关闭服务器套接字(可选),,TCP 时间戳服务器 from socket import * from time import ctime HOST = '‘ PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5),,while True: print 'waiting for connection.‘ tcpCliSock, addr = tcpSerSock.accept() print '.connected from:', addr while True: data = tcpCliSock.recv(BUFSIZ) if not data: Break tcpCliSock.send('[%s] %s' % (ctime(), data)) tcpCliSock.close() tcpSerSock.close(),,TCP 客户端 cs = socket() # 创建客户套接字 cs.connect() # 尝试连接服务器 comm_loop: # 通讯循环 cs.send()/cs.recv() # 对话(发送/接收) cs.clos e() # 关闭客户套接字 客户有了套接字之后,马上就可以调用connect()函数去连接服务器。

      连接建立后,就可以与服务器开始对话了,,from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR),,while True: data = raw_input(' ') if not data: break tcpCliSock.send(data) data = tcpCliSock.recv(BUFSIZ) if not data: break print data tcpCliSock.close(),,运行客户端与服务器程序 客户端的输入与输出 hi [Sat Jun 17 17:27:21 2006] hi spanish inquisition [Sat Jun 17 17:27:37 2006] spanish inquisition 服务器的输出 waiting for connection. .connected from: ('127.0.0.1', 1040) waiting for connection.,,UDP 服务器 ss = socket() # 创建一个服务器套接字 ss.bind() # 绑定服务器套接字 inf_loop: # 服务器无限循环 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) ss.close() # 关闭服务器套接字,,HOST = '‘ PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM) udpSerSock.bind(ADDR) while True: print 'waiting for message.‘ data, addr = udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto('[%s] %s' % ( ctime(), data), addr) print '.received from and returned to:', 21 udpSerSock.close(),,UDP 客户端 cs = socket() # 创建客户套接字 comm_loop: # 通讯循环 cs.sendto()/cs.recvfrom() # 对话(发送/接收) cs.close() # 关闭客户套接字,,HOST = 'localhost‘ PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) while True: data = raw_input(' ') if not data: Break udpCliSock.sendto(data, ADDR),,data, ADDR = udpCliSock.recvfrom(BUFSIZ) if not data: Break print dataudpCliSock.close() udpCliSock.close(),,属性名字 描述 数据属性 AF_UNIX, AF_INET, AF_INET6a Python 支持的套接字家族 SO_STREAM, SO_DGRAM 套接字类型 (TCP = 流, UDP = 数据报) has_ipv6b 表示是否支持IPv6 的标志变量 异常 error 套接字相关错误 herrora 主机和地址相关的错误 gaierrora 地址相关的错误 timeoutb 超时,,函数 socket() 用指定的地址家族,套接字类型和协议类型(可选)创建一个套接字对象 socketpair()c 用指定的地址家族,套接字类型和协议类型(可选)创建一对套接字对象 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()/ 把IP 地址转为32 位整型,以及反向函数 inet_ntoa() inet_pton()/ 把IP 地址转为二进制格式以及反向函数仅对IPv4 地址有效) inet_ntop() getdefaulttimeout()/ 得到/设置默认的套接字超时时间,单位秒(浮点数) setdefaulttimeout(),。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.