归档 2010年5月18日

最后更新于 .

好吧,用pickle的过程真是不顺利……,在mod_python中使用pickle调用dumps向server发包的时候,server那端解包loads时,会报如下错误:

ImportError: No module named _mp_6dce10900009df6fcff2918ac677e596

网上一堆资料,还全是英文,结果最后居然在一个留言里找到了答案……
方法就是,指定class的__module__属性:

#自定义类名为MManRsp,所属模块为mmanpro
MManReq.__module__ = "mmanpro"

答案链接页面:
http://www.modpython.org/pipermail/mod_python/2008-July/025442.html

之后在实例化类对象,调用dumps方法即可。

最近python相关的文章比较多,呵呵,希望博友不要介意~

最后更新于 .

在用C/C++写网络打包/解包时,都是自己用指针偏移来实现对象<->二进制之间的互转,现在既然用了python,也要用一下序列化的思想,所以就使用cPickle来完成这件事情。

不过事情并不顺利……
假设我们在server端和client端通过类MManRsp来进行通信,这个类定义在mmanpro.py中,代码如下:

class MManRsp:
    ret = 0
    pathverlist = []

现在server端对client端回包如下:(源代码并非如此,为了演示,所以简化了代码)

rsp = MManRsp()
data = [('1',1),('2',2)]
for t in data:
    x = do_something(t)#还是返回('1',1)这种类型
    rsp.pathverlist.append(x)
senddata = cPickle.dumps(rsp)
#send

client端解析为:

rsp = cPickle.loads(recvdata ...

最后更新于 .

最近看《python核心编程》,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研究了一下如何在server端通过启动不同的线程(进程)来实现每个链接一个线程。

其实python在类的设计上已经考虑到了这一方面的需求,我们只要在自己的server上继承一下SocketServer.BaseRequestHandler就可以了。
server端代码如下:

#!/usr/bin/env python
import SocketServer
from time import ctime
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
class MyRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print '...connected from:', self.client_address
        while True:
            self.request.sendall('[%s] %s' % (ctime(),self.request.recv(1024)))
tcpServ = SocketServer.ThreadingTCPServer(ADDR ...

昨天

2010年5月16日

明天

2010年5月23日

归档