首页 > 代码库 > python 14章,网络编程

python 14章,网络编程

一,socket 模块

套接字包括两类:服务器,客户机,

创建一个套接字后让它等待连接

服务器:

import socket
s = socket.socket()
port = 1234
host = socket.gethostname()
print host
s.bind((host,port))
s.listen(5)
while True:
    get,addr = s.accept()
    print ‘Got connection from‘,addr
    get.send(‘Thank you for connecting‘)
    get.close()

客户机:

import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host,port))
print s.recv(1024)

>>> 
Z5WRYRLDY59AL03
Got connection from (‘222.27.174.175‘, 53389)
Got connection from (‘222.27.174.175‘, 53398)
Got connection from (‘222.27.174.175‘, 53405)
Got connection from (‘222.27.174.175‘, 53407)

>>> ================================ RESTART ================================
>>> 
Thank you for connecting
>>> ================================ RESTART ================================
>>> 
Thank you for connecting
>>> ================================ RESTART ================================
>>> 
Thank you for connecting
>>> ================================ RESTART ================================
>>> 
Thank you for connecting

二,urllib,urllib2

  可以通过 网络访问文件,借用URL简单下载用urllib 如果要用http验证或用cookie 用urllib2

1.打开远程文件

from urllib import urlopen

webpage = urlopen("http://www.baidu.com")

urlopen 方法:close,read,readline,readlines

2.获取远程文件

urlretrieve(‘http://www.python.org‘,‘c:\\python.html‘)

默认放在临时位置,用urlcleanup清理

三,SocketServer

SocketServer是许多服务器框架的基础如:BaseHTTPServer,SimpleHTTPServer,CGIHTTPServer

SocketSever包含4个基本类:1针对TCP套接字流的TCPServer,2.针对UDP数据报UDPServer 3.UnixStreamServer 4.UnixDatagramServer

服务器:

from SocketServer import TCPServer,StreamRequestHandler
import socket
class Handler(StreamRequestHandler):

    def handle(self):
        addr = self.request.getpeername()
        print ‘Got connection from‘,addr
        self.wfile.write(‘Thank you for connecting!!!‘)
host = socket.gethostname()
server = TCPServer((host,1234),Handler)
server.serve_forever()
>>> 
Thank you for connecting!!!
>>>

Got connection from (‘222.27.174.175‘, 55479) 

四,多连接

3种方法: 分叉(forking),线程(threading),异步IO(asynchronous I/O)

使用SocketServer进行分叉和线程处理

from SocketServer import TCPServer,ForkingMixIn,StreamRequestHandler
import socket
class Server(ForkingMixIn,TCPServer):pass

class Handler(StreamRequestHandler):

    def handle(self):
        addr = self.request.getpeername()
        print ‘Got connection from‘,addr
        self.wfile.write(‘Thank you for connecting ...‘)
host = socket.gethostname()
server = Server((‘‘,1234),Handler)
server.serve_forever()

使用select

import socket,select
s = socket.socket()
host = socket.gethostname()
port = 3306
print host
s.bind((host,port))

s.listen(5)
inputs = [s]
while True:
    rs,ws,es = select.select(inputs,[],[])
    for r in rs:
        if r is s:
            c,addr = s.accept()
            print ‘Got connection form‘,addr
            inputs.append(c)
        else:
            try:
                data = r.recv(1024)
                disconnected = not data
                if data:
                    r.send(‘yes!I can hear you!‘)
            except socket.error:
                disconnected = True

            if disconnected:
                print r.getpeername(),‘disconnected‘
                inputs.remove(r)
            else:
                print data