#!/usr/bin/env python
# -*- coding: utf8 -*-
import asyncore
import logging
import sys
logging.basicConfig(level=logging.DEBUG,
format='[*] %(name)s - %(funcName)16s - %(message)s')
class ConsoleHandler(asyncore.file_dispatcher):
"""Enable console interactive for socket read/write.
"""
def __init__(self, sender, file):
asyncore.file_dispatcher.__init__(self, file)
self.current_chat = sender
self.BUFSIZE = 1024
def handle_read(self):
self.current_chat.out_buffer += self.recv(self.BUFSIZE)
class ChatManager(asyncore.dispatcher):
"""Handle tcp in-connections, ex: send commands to targets.
"""
def __init__(self, _sock=None, _map=None):
self.logger = logging.getLogger('ChatManager')
self.BUFSIZE = 1024
asyncore.dispatcher.__init__(self, _sock, _map)
self.out_buffer = ''
def handle_read(self):
"""Called when the asynchronous loop detects that a read() call on
the channel's socket will succeed."""
data = self.recv(self.BUFSIZE)
self.logger.debug('%d bytes | client <- server' % len(data))
print(data.strip())
# self.send(data)
self.logger.debug('%d bytes | client -> server' % len(data))
def handle_write(self):
"""Called when the asynchronous loop detects that a writable
socket can be written. Often this method will implement the
necessary buffering for performance. For example:
"""
if self.out_buffer != "":
sent = self.send(self.out_buffer)
self.out_buffer = self.out_buffer[sent:]
def handle_error(self):
"""Called when an exception is raised and not otherwise handled.
The default version prints a condensed traceback.
"""
self.logger.debug('socket exception')
def handle_close(self):
"""Called when the socket is closed.
"""
self.close()
class Listener(asyncore.dispatcher):
"""Start a tcp listener (default: 127.0.0.1:4444), and wait for connections.
If a new connection, `ChatManager' will try to handle it.
"""
def __init__(self, addr=('127.0.0.1', 4444), max_connections=4):
self.logger = logging.getLogger('Listener')
asyncore.dispatcher.__init__(self)
self.logger.debug('create a socket')
self.create_socket(asyncore.socket.AF_INET,
asyncore.socket.SOCK_STREAM)
# socket reuse address
self.set_reuse_addr()
self.bind(addr)
self.logger.debug('bind socket address')
self.listen(max_connections)
self.logger.debug('listen socket on %s:%s' % addr)
def handle_accept(self):
client, caddr = self.accept()
self.logger.debug('client: %s:%s' % caddr)
self.logger.debug('Enter into ChatManager')
ConsoleHandler(ChatManager(client), sys.stdin)
if __name__ == "__main__":
Listener()
asyncore.loop()
Пожалуйста, просмотрите следующее использование:
$ python ChatManager.py
[*] Listener - __init__ - create a socket
[*] Listener - __init__ - bind socket address
[*] Listener - __init__ - listen socket on 127.0.0.1:4444
Пожалуйста, установите соединение с сервером символов с:
$ nc -v 127.0.0.1 4444
И затем, вы можете общаться с сервером на терминале.