Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316326
  • 博文数量: 240
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-04 18:14
文章分类

全部博文(240)

文章存档

2017年(8)

2014年(4)

2013年(15)

2012年(4)

2011年(14)

2010年(55)

2009年(140)

我的朋友

分类: Python/Ruby

2010-07-02 20:48:35

首先,了解下阻塞和非阻塞:

在阻塞模式下, 程序在调用接收函数时(如recv), 如果没有数据到达, 此函数会一直等待, 即当前线程会被阻塞, 直到有数据时才返回!

在非阻塞模式下, 程序在调用接收函数时, 接收函数会立即返回, 调用方还可以进行其它操作, 而当有数据到达进, 操作系统会通过某些方法(如事件)来通知你!

再了解下SocketServer模块中可供使用的类:
BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。

TCPServer/UDPServer:基本的网络同步TCP/UDP服务器。

UnixStreamServer/ UnixDatagramServer:基本的基于文件同步TCP/UDP服务器

ForkingMixIn/ ThreadingMixIn:实现了核心的进程化或线程化的功能;作为混合类,与服务器类一并使用以提供一些异步特性;这个类不会直接实例化。

ForkingTCPServer/ ForkingUDPServer:ForkingMixIn和TCPServer/UDPServer的组合。

BaseRequestHandler:包含处理服务请求的核心功能。这个类只用于派生,所以不会生成这个类的实例可以考虑使用StreamRequestHandler或DatagramRequestHandler。

StreamRequestHandler/ DatagramRequestHandler:用于TCP/UDP服务器的服务处理工具。

下面我们正式进入主题,这里我们采用StreamRequestHandler和ThreadingTCPServer来实现客户端与服务器并发连接非阻塞socket。

ThreadingTCPServer派生自ThreadingMixIn,主要实现核心的进程化合线程化功能。

StreamRequestHandler主要用于用于TCP/UDP服务器的服务处理工具。

 

一、创建SocketServerTCP服务器:

import SocketServer
from SocketServer import StreamRequestHandler as SRH
from time import ctime
  
host = ''
port = 3130
addr = (host,port)
  
class Servers(SRH):
    def handle(self):
        print 'got connection from ',self.client_address
        self.wfile.write('connection %s:%s at %s succeed!' % (host,port,ctime()))
        while True:
            data = self.request.recv(1024)
            if not data: break
            print data
            self.request.send(data)
  
print 'server is running....'
server = SocketServer.ThreadingTCPServer(addr,Servers)
server.serve_forever()


 

二、创建SocketServerTCP客户端

from socket import *
  
host = 'localhost'
port = 3130
bufsize = 1024
addr = (host,port)
client = socket(AF_INET,SOCK_STREAM)
client.connect(addr)
  
while True:
    data = raw_input()
    if not data or data=='exit':
        break
    client.send('%s\r\n' % data)
    data = client.recv(bufsize)
    if not data:
        break
    print data.strip()
  
client.close()


阅读(1315) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~