关于python:xmlrpc服务器有问题

problem with xmlrpc server

我使用xmlrpc服务器运行简单的示例,然后按键盘上的ctrl-c:。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from SimpleXMLRPCServer import SimpleXMLRPCServer
from time import sleep
import threading,time

class Test(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.test1 = 0
    def test(self):
        return self.test1

    def run(self):
        while(1):
            time.sleep(1)
            self.test1 = self.test1 + 1

ts = Test()
ts.start()
server =  SimpleXMLRPCServer(("localhost",8888))
server.register_instance(ts)
server.serve_forever()

按下键盘后出错:

1
2
3
  File"/usr/lib/python2.7/SocketServer.py", line 225, in serve_forever
    r, w, e = select.select([self], [], [], poll_interval)
KeyboardInterrupt

客户端

1
2
3
from xmlrpclib import ServerProxy
r=ServerProxy("http://localhost:8888")
print r.test()

正在等待连接,没有错误或警告。在这种情况下如何断开连接?也许这个例子不正确?


使用方式:

在xmlrpclib.serverproxy超时设置

编辑

这里的答案是不兼容,与Python 2.7。在这一改进的代码(在线测试activepython W7的作品:(2.7)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import xmlrpclib
import httplib

class TimeoutHTTPConnection(httplib.HTTPConnection):

    def __init__(self,host,timeout=10):
        httplib.HTTPConnection.__init__(self,host,timeout=timeout)
        self.set_debuglevel(99)
        #self.sock.settimeout(timeout)

"""
class TimeoutHTTP(httplib.HTTP):
    _connection_class = TimeoutHTTPConnection
    def set_timeout(self, timeout):
        self._conn.timeout = timeout
"""


class TimeoutTransport(xmlrpclib.Transport):
    def __init__(self, timeout=10, *l, **kw):
        xmlrpclib.Transport.__init__(self,*l,**kw)
        self.timeout=timeout

    def make_connection(self, host):
        conn = TimeoutHTTPConnection(host,self.timeout)
        return conn

class TimeoutServerProxy(xmlrpclib.ServerProxy):
    def __init__(self,uri,timeout=10,*l,**kw):
        kw['transport']=TimeoutTransport(timeout=timeout, use_datetime=kw.get('use_datetime',0))
        xmlrpclib.ServerProxy.__init__(self,uri,*l,**kw)

if __name__ =="__main__":
    s=TimeoutServerProxy('http://127.0.0.1:8888',timeout=2)
    print s.test()


让你的Test实例的恶魔,当主线程退出quits:

1
2
3
ts = Test()
ts.setDaemon(True)
ts.start()

"问题是,你为什么要注册的XML - RPC的一个线程的句柄。