python 网络编程常用代码段

785次阅读  |  发布于5年以前

服务器端代码:


    # -*- coding: cp936 -*-
    import socket 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#初始化socket 
    sock.bind(("127.0.0.1", 8001))#绑定本机地址,8001端口
    sock.listen(5)#等待客户连接 
    while True:
      print "waiting client connection..."
      connection,address = sock.accept()#接收客户连接请求
      print "a client have connected..."
      while True:
        try: 
          connection.settimeout(5) #设置超时时间
          buf = connection.recv(1024) #接收数据
          if buf == "1": 
            connection.send("you have send me 1!welcome to server!")
          elif buf=="2":
            connection.send("you have send me 2!I have recv!")
          elif buf=="3":
            connection.send("close the connection!")
            break
          else: 
            connection.send("unknow command!") 
        except socket.timeout: 
          print "time out" 
      connection.close()
      print "a client exit..."

客户器端代码:


    import socket 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect(("127.0.0.1", 8001)) 
    import time 
    time.sleep(2)
    while True:
      data=raw_input("input command:");
      sock.send(data)
      print sock.recv(1024)
      if data=="3":
        break
    sock.close()

1.首先开两个IDLE,分别打开服务器端和客户器端代码。
2.F5运行服务器端代码,会出现waiting client connection...
3.F5运行客户端代码,会出现input command: ;
4.这时服务器和客户端就连接上了,可以正常的通信啦,如图:

5.再次运行服务器端代码时会出现错误,这时可以通过任务管理器,将其中的pythonw.exe进程结束,重新打开,编译就可以啦!

客户端:


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

服务端:


    import socket
    s = socket.socket()
    host = socket.gethostname()
    port = 1234
    s.bind((host, port))

    s.listen(5)
    while True:
     c, addr = s.accept()
     print 'Got connection from', addr
     c.send('Thank you for connecting')
     c.close()

http编程


    from urllib import urlopen
    webpage = urlopen('http://www.python.org')

加上正规表达式


    import re
    text = webpage.read()
    m = re.search('<a href="([^"]+)" .*?>about</a>', text, re.IGNORECASE)
    m.group(1)

urllib
urllib2

一个基于SocketServer的小型服务器例子:


    from SocketServer import TCPServer, StreamRequestHandler
    >>> class Handler(StreamRequestHandler):
        def handle(self):
            addr = self.request.getpeername()
            print 'Got connection from', addr
            self.wfile.write('Thank you for connecting')

    >>> server = TCPServer(('',1234), Handler)
    >>> server.serve_forever()

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


    from SocketServer import TCPServer,ForkingMinIn, StreamRequestHandler
    class Server(ForkingMinIn, TCPServer):pass
    class Handler(StreamRequestHandler):
     def handle(self):
      addr = self.request.getpeername()
      print 'Got connection from',addr
      self.wfile.write('Thank you for connection')
    server = Server(('',1234),Handler)
    server.serve_forever()

线程Server:


    from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
    class Server(ThreadingMixIn, TCPServer):pass
    class Handler(StreamRequestHandler):
     def handle(self):
      addr = self.request.getpeername()
      print 'Got connection from',addr
      self.wfile.write('Thank you for connecting')
    server = Server(('',1234),Handler)
    server.serve_forever()

带有select和pool的异步I/O
select服务:


    import socket, select
    s = socket.socket()
    host = socket.gethostname()
    prot = 1234
    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 from',addr
      inputs.append(c)
     else:
      try:
       data = r.recv(1024)
       disconnected = not data
      except socket.error:
       disconnected = True

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

pool服务器:


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

    fdmap = {s.fileno():s}

    s.listen(5)
    p = select.poll()
    p.register(s)
    while True:
     events = p.poll()
     for fd, event in events:
      if fd in fdmap:
       c, addr = s.accept()
       print 'Got connection from', addr
       p.register(c)
       fdmap[c.fileno()]=c
      elif event & select.POLLIN:
       data = fdmap[fd].recv(1024)
       if not data:
        print fdmap[fd].getpeername(),'disconnected'
        p.unregister(fd)
        del fdmap[fd]
      else:
       print data

Twisted网络框架

http://www.jb51.net/article/64199.htm

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8