# Object adaptor for the client import communication from socket import * class ObjectAdaptor(object): def __init__(self, ip, port): self.ip = ip self.port = port def send(self, *args): communication.send(self.channel, args) def receive(self): return communication.receive(self.channel) def remoteInvoke(self, fun, *args): method = (fun.func_name, ) + args self.channel = socket(AF_INET, SOCK_STREAM, 0) self.channel.connect((self.ip, self.port)) self.send(*method) result = self.receive() self.channel.close() return result[0] # Object server for the actual object import communication import types from socket import * class ObjectServer(object): def __init__(self, ip, port): self.channel = socket(AF_INET, SOCK_STREAM, 0) self.channel.bind((ip, port)) self.channel.listen(50) self.info = self.channel.getsockname() def send(self, client, *args): communication.send(client, args) def receive(self, client): return communication.receive(client) def getInfo(self): return self.info def dispatch(self, invoke, client): dict = self.__class__.__dict__ method = invoke[0] if (method in dict.keys() and type(dict[method]) == types.FunctionType): method = dict[method] params = invoke[1:] result = method(self, *params) self.send(client, result) def start(self): while (1): client = self.channel.accept()[0] invoke = self.receive(client) self.dispatch(invoke, client) # Communication code (the import communcation statements) from socket import htonl, ntohl import cPickle import struct marshall = cPickle.dumps unmarshall = cPickle.loads def send(channel, *args): buf = marshall(args) value = htonl(len(buf)) size = struct.pack("L", value) channel.send(size) channel.send(buf) def receive(channel): size = struct.calcsize("L") size = channel.recv(size) size = ntohl(struct.unpack("L", size)[0]) buf = "" while len(buf) < size: buf = channel.recv(size - len(buf)) return unmarshall(buf)[0] # Echo server sample class EchoServer(ObjectServer): def __init__(self, ip, port): ObjectServer.__init__(self, ip, port) def echo(self, msg): return "Message received: %s" % msg es = EchoServer("127.0.0.1", 10000) es.start() # Echo client sample class EchoClient(ObjectAdaptor): def __init__(self, ip, port): ObjectAdaptor.__init__(self, ip, port) def echo(self, msg): return self.remoteInvoke(self.echo, msg) ec = EchoClient("127.0.0.1", 10000) print ec.echo("Hello World!")