/examples/jsonrpc/public/services/jsonrpc/socketserver.py
Python | 91 lines | 69 code | 3 blank | 19 comment | 0 complexity | c038c0f2c5658c6e3197e41f1021d095 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0
- """
- Copyright (c) 2006 Jan-Klaas Kollhof
- This file is part of jsonrpc.
- jsonrpc is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- This software is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with this software; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- """
- from jsonrpc import SimpleServiceHandler
- import socket
- from threading import Thread
-
-
- class SocketServiceHandler(SimpleServiceHandler):
- def __init__(self, socket, service, messageDelimiter=""):
- self.socket = socket
- SimpleServiceHandler.__init__(self, service, messageDelimiter=messageDelimiter)
-
- def receiveForever(self):
- while 1:
- try:
- data = self.socket.recv(1024)
- except:
- data = None
- if not data:
- if self.socket:
- self.close()
- return
- else:
- self.handlePartialData(data)
-
- def send(self, data):
- self.socket.send(data)
-
- def close(self):
- SimpleServiceHandler.close(self)
- if self.socket:
- try:
- self.socket.shutdown(socket.SHUT_RDWR)
- self.socket = None
- except:
- pass
-
- class TCPServiceServer:
- def __init__(self, service, ConnectionHandler = SocketServiceHandler, messageDelimiter=""):
- self.service = service
- self.ConnectionHandler = ConnectionHandler
- self.messageDelimiter=messageDelimiter
-
- def serve(self, address):
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.socket.bind(address)
- self.socket.listen(5)
- print "serving", self.socket
- while 1:
- (conn,addr) = self.socket.accept()
- self.acceptConnection(conn)
-
- def acceptConnection(self, conn):
- self.handleConnection(conn)
-
- def handleConnection(self, conn):
- self.ConnectionHandler(conn, self.service, messageDelimiter=self.messageDelimiter).receiveForever()
-
- class ThreadingMixin:
- def acceptConnection(self, conn):
- t = Thread(target=self.handleConnection, args=(conn,))
- t.setDaemon(True)
- t.start()
- class ThreadedTCPServiceServer(ThreadingMixin, TCPServiceServer):
- pass
-
-