62 lines
1.7 KiB
Python
62 lines
1.7 KiB
Python
import asyncore
|
|
import socket
|
|
|
|
|
|
class LineHandler(asyncore.dispatcher_with_send):
|
|
|
|
def __init__(self, sock):
|
|
self.buffer = ""
|
|
asyncore.dispatcher_with_send.__init__(self, sock)
|
|
self.crlf = 0
|
|
|
|
def handle_read(self):
|
|
data = self.recv(8192)
|
|
if data:
|
|
parts = data.split("\n")
|
|
if len(parts) == 1:
|
|
self.buffer += data
|
|
else:
|
|
self.handle_line(self.buffer + parts[0])
|
|
for part in parts[1:-1]:
|
|
if part[-1] == "\r":
|
|
self.crlf = True
|
|
part = part[:-1]
|
|
else:
|
|
self.crlf = False
|
|
self.handle_line(part)
|
|
self.buffer = parts[-1]
|
|
|
|
def send_line(self, line):
|
|
self.send(line + ("\r\n" if self.crlf else "\n"))
|
|
|
|
def handle_line(self, line):
|
|
'''
|
|
test: simple echo handler
|
|
'''
|
|
self.send_line("> " + line)
|
|
|
|
|
|
class LineServer(asyncore.dispatcher):
|
|
|
|
def __init__(self, host, port, lineHandlerClass):
|
|
asyncore.dispatcher.__init__(self)
|
|
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
self.set_reuse_addr()
|
|
self.bind((host, port))
|
|
self.listen(5)
|
|
self.lineHandlerClass = lineHandlerClass
|
|
|
|
def handle_accept(self):
|
|
pair = self.accept()
|
|
if pair is not None:
|
|
sock, addr = pair
|
|
print "Incoming connection from %s" % repr(addr)
|
|
handler = self.lineHandlerClass(sock)
|
|
|
|
def loop(self):
|
|
asyncore.loop()
|
|
|
|
if __name__ == "__main__":
|
|
server = LineServer("localhost", 9999, LineHandler)
|
|
server.loop()
|