码迷,mamicode.com
首页 > 编程语言 > 详细

python网络编程

时间:2014-11-04 22:33:00      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   使用   for   

此篇博文是《python核心编程》的第16章的笔记

主要介绍了基于套接字的这种低级别的协议的使用,由于是底层的所以在调bug神马会非常受用

客户、服务器的几个例子:

硬件形式的:打印机服务器、文件服务器

软件形式的:web服务器、数据库服务器、窗口服务器

关于银行出纳也是这样类似的客户服务器模型

关于套接字

套接字是网络通信最为底层的东西

套接字的两个分类分别是:

AF_UNIX(用于本地)与AF_INET(用于网络)

Python 只支持AF_UNIX,AF_NETLINK,和AF_INET 家族。由于我们只关心网络编程,所以在本
章的大部分时候,我们都只用AF_INET

地址和端口

如果把套接字比做电话的插口——即通讯的最底层结构,那主机与端口就像区号与电话号码的
一对组合。有了能打电话的硬件还不够,你还要知道你要打给谁,往哪打。

套接字的另外一种分类方式:

面向连接

实现这种连接的主要协议就是传输控制协议(即TCP)。要创建TCP 套接字就得在创建的时候,
指定套接字类型为SOCK_STREAM。TCP 套接字采用SOCK_STREAM 这个名字,表达了它做为流套接字的
特点。由于这些套接字使用Internet 协议(IP)来查找网络中的主机,这样形成的整个系统,一般
会由这两个协议(TCP 和IP)来提及,即TCP/IP。

无连接

实现这种连接的主要协议就是用户数据报协议(即UDP)。要创建UDP 套接字就得在创建的时候,
指定套接字类型为SOCK_DGRAM。SOCK_DGRAM 这个名字,也许你已经猜到了,来自于单词“datagram”
(“数据报”)。由于这些套接字使用Internet 协议来查找网络中的主机,这样形成的整个系统,
般会由这两个协议(UDP 和IP)来提及,即UDP/IP。

python中的套接字

使用socket模块

使用该模块的方法你可以Google或者查看help(socket)

bubuko.com,布布扣

使用它是通过创建一个socket对象,然后所有的操作通过对象的方法来实现,socket对象构建额参数就是上面所说的几个概念

使用socket开发服务器

你也许想知道很多软件服务器是如何开发出来的,既然socket是底层的网络编程的组件,那么可以用它来开发一个网络服务器,下面的代码使用socket模块实现了一个简单的时间服务器,使用TCP/IP,使用UDP的例子可以参考原书

服务端代码:

   import socket  
    from time import ctime
    # 创建一个套接字对象
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    #把这个套接字对象绑定到一个服务器地址,这里是本地
    sock.bind((localhost, 8001))  
    ##设置好套接字开始监听,里面的5是什么意思呢
    sock.listen(5)  
    # 开始无限等待服务的循环
    while True:  
        print waiting for connection..
        ##当用户请求时,创建一个关于该用户的套接字,和该用户的地址
        cliensock,address = sock.accept()  
        print cliensock
        print conncet from, address
        try:  
            ##设置客户请求的等待时间
            cliensock.settimeout(5)  
            ## 接受客户的请求,data是返回的数据,似乎例子中是string类型的
            data = cliensock.recv(1024)    
            ##返回一个字符类型的数据,使用send方法
            cliensock.send([%s]%s%(ctime(),data))             
        except socket.timeout:  
            print time out  
        cliensock.close()  

 

客户端代码

    import socket  
    #创建套接字对象
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    #链接到一个服务器地址
    sock.connect((localhost, 8001)) 
    #发送数据,string类型的
    sock.send(fvsbvdb) 
    #接受返回的数据
    print sock.recv(1024)  
    sock.close()  

 

一个增强socket模块?

SocketServer 是标准库中一个高级别的模块。用于简化网络客户与服务器的实现。模块中,
已经实现了一些可供使用的类。

你也会注意到,我们的程序现在是“事件驱动”了。这就意味着,只有在事件出现的时候,程序才有“反应”。界面编程(第18 章)也是事件驱动的。你会注意到有一个相似之处,即在代码的最后一行都有一个服务器的无限循环,等待并处理客户的服务请求。

请仔细看看下面的代码实现上面的时间服务器,你会发现这里变成面向对象编程以及事件驱动了

服务器段代码

from SocketServer import TCPServer as TCP,StreamRequestHandler as SRH
from time import ctime

HOST = ‘‘
PORT = 21567
ADDR = (HOST, PORT)

class MyRequestHandler(SRH):
    def handle(self):
        print ...connected from:, self.client_address
        self.wfile.write([%s] %s % (ctime(),self.rfile.readline()))
        
tcpServ = TCP(ADDR, MyRequestHandler)
print waiting for connection...
tcpServ.serve_forever()

客户端代码

from socket import *
HOST = localhost
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
while True:
    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    data = raw_input(> )
    if not data:
        break
    tcpCliSock.send(%s\r\n % data)
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print data.strip()
    tcpCliSock.close()

Twisted 框架???

Twisted 是一个完全事件驱动的网络框架。它允许你使用和开发完全异步的网络应用程序和协议。

它为你创建一个完整系统提供了很大的帮助。系统中可以有:网络协议,线程,安全和认证,聊天/即时通讯,数据库管理,关系数据库集成,网页/互联网,电子邮件,命令行参数,图形界面集成等。

与网络和套接字相关的Python 模块

socket 底层网络接口。
asyncore/ 为能异步处理客户请求的网络应用程序提供底层功能。
asynchat
select 在单线程网络服务器程序中,管理多个套接字连接。
SocketServer 包含了写网络应用程序服务器所需要的高级别模块。提供了完整的进程和线程
的版本。

建议

async*和SocketServer 模块在创建服务器方面都提供了高层次的功能。由于是基于socket 和
(或)select 模块,封装了所有的底层的代码,它们使得你可以快速开发客户/服务器的系统

虽然async*是标准库提供的唯一的异步开发支持库。我们也可选择如Twisted 这样的,相对标
准库更现代,更强大的第三方库。

我们本章所讨论的主题涵盖了在Python 中用socket 网络编程和如何用低级别的协议如TCP/IP
和UDP/IP 来创建应用程序。如果你想要开发高层次的网页和Internet 应用程序,我们强烈建议你
阅读第17 章和第20 章。

 第17章和第20章是:网络客户端编程以及web编程

号外:关于阻塞非阻塞,同步异步的解释

python网络编程

标签:style   blog   http   io   color   ar   os   使用   for   

原文地址:http://www.cnblogs.com/wybert/p/4074824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!