예제 #1
0
class Server(object):
    def __init__(self):
        # self.users = []
        self.records = []
        self.connect_sockets = []
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,
                                      1)
        self.interrupt_socket = socket.socket(socket.AF_UNIX,
                                              socket.SOCK_STREAM)
        self.s_termin_io = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s_termin_io.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.c_termin_io = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.c_termin_io.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.port = 3657
        self.io_port = 3658
        self.connect_sockets.append(self.server_socket)
        self.connect_sockets.append(self.interrupt_socket)
        self.connect_sockets.append(self.s_termin_io)
        self.is_started = False
        self.is_continue = True

    def run(self):
        logging.info("run!")
        #if not self.is_started:
        #    self.start()
        self._accept_loop()

    def start(self):
        self.s_termin_io.bind(('localhost', self.io_port))
        self.s_termin_io.listen(1)
        # self.c_termin_io.connect(('localhost',self.io_port))
        self.ui = UI(self.c_termin_io, self.io_port)
        self.server_socket.bind(("localhost", self.port))
        self.server_socket.listen(5)
        try:
            os.remove('server_interrupt.sock')
        except OSError:
            pass
        self.interrupt_socket.bind('server_interrupt.sock')
        self.interrupt_socket.listen(1)
        server_run = self.run
        ui_run = self.ui.run
        self.is_started = True
        # gevent.spawn(server_run)
        #threading.Thread(target=server_run).start()
        ## gevent.joinall([
        ##                 gevent.spawn(server_run),
        ##                 gevent.spawn(ui_run),
        ##                 ])
        threading.Thread(target=ui_run).start()
        server_run()

    def broadcast(self, sock, data):
        end_socks = []
        for _socket in self.connect_sockets[:]:
            if _socket != self.server_socket and _socket != sock:
                try:
                    _socket.send(data)
                except:
                    _socket.close()
                    end_socks.append(_socket)
        for _socket in end_socks:
            self.connect_sockets.remove(_socket)

    def _accept_loop(self):
        logging.info("loop!")
        while True and self.ui.is_continue and self.is_continue:
            read_sockets, write_sockets, error_sockets = select.select(
                self.connect_sockets, [], [], 1)
            end_socks = []
            for sock in read_sockets:
                if sock == self.server_socket:
                    logging.info('server socket target')
                    sockfd, addr = self.server_socket.accept()
                    self.connect_sockets.append(sockfd)
                    self.ui.append("{} enter the room".format(addr))
                    logging.info("new client enter")
                    self.broadcast(sock, "{} enter the room".format(addr))
                elif sock == self.interrupt_socket:
                    continue
                elif sock == self.s_termin_io:
                    try:
                        sockfd, addr = sock.accept()
                        self.io = sockfd
                        self.connect_sockets.append(self.io)
                        data = self.io.recv(4096)
                        logging.info("termin io data {}".format(data))
                        if data:
                            data = data.replace('\r', '').replace('\n', '')
                            content = str("someone >" + data)
                            self.broadcast(sock, content)
                    except:
                        self.io.close()
                        logging.info("socket error, einfo {}".format(einfo()))
                elif sock == self.io:
                    try:
                        data = sock.recv(4096)
                        if data:
                            data = data.replace('\r', '').replace('\n', '')
                            content = str("someone >" + data)
                            self.broadcast(sock, content)
                    except:
                        self.io.close()
                        logging.info("socket io error, einfo {}".format(
                            einfo()))
                else:
                    try:
                        logging.info("else target")
                        data = sock.recv(4096)
                        if data:
                            logging.info("data: {}".format(type(data)))
                            data = data.replace('\r', '').replace('\n', '')
                            content = str(sock.getpeername()) + ">" + data
                            # self.records.append(content)
                            self.ui.append(content)
                            self.broadcast(sock, content)
                    except:
                        logging.info("sock error, einfo {}".format(einfo()))
                        self.broadcast(sock,
                                       "Client {} is offline".format(addr))
                        sock.close()
                        end_socks.append(sock)
            for _socket in end_socks:
                self.connect_sockets.remove(_socket)
        logging.info("server socket end")
        try:
            os.remove('server_interrupt.sock')
        except OSError:
            pass
        # self.server_socket.close()
        for sock in self.connect_sockets:
            sock.close()
예제 #2
0
class Client(object):
    def __init__(self):
        # self.records = []
        self.host = "0.0.0.0"
        self.port = 3657
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # self.stdin = sys.stdin
        # self.local_socket_server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        # self.local_socket_client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        # self.sockets = [self.stdin, self.client_socket]
        # self.sockets = [self.local_socket_server, self.client_socket]
        self.interrupt_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        try:
            os.remove('client_termin_io.sock')
        except OSError:
            pass
        self.s_termin_io = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.c_termin_io = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s_termin_io.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.c_termin_io.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sockets = [self.client_socket]
        self.sockets.append(self.s_termin_io)
        self.is_started = False
        self.io_port = 3659

    def run(self):
        #if not self.is_started:
        #self.start()
        self._loop()

    def start(self):
        self.s_termin_io.bind(('localhost', self.io_port))
        self.s_termin_io.listen(1)
        self.client_socket.connect(("localhost", self.port))
        self.interrupt_socket.bind('client_interrupt.sock')
        self.interrupt_socket.listen(1)
        self.ui = UI(self.c_termin_io, self.io_port, True) 
        client_run = self.run
        ui_run = self.ui.run
        threading.Thread(target=ui_run).start()
        client_run()

    def end(self):
        self.client_socket.close()
        try:
            os.remove('client_interrupt.sock')
        except OSError:
            pass
        #self.ui.end()

    def _loop(self):
        logging.info("in loop")
        try:
            while True:
                rsockets,wsockets,esockets = select.select(self.sockets,[],[])
                for _socket in rsockets:
                    # receive msg
                    if _socket == self.client_socket:
                        data = _socket.recv(4096)
                        if data:
                            # self.records.append(data)
                            logging.info(data)
                            self.ui.append(data)
                        else:
                            logging.error("\nDisconnect from server")
                            sys.exit()
                    elif _socket == self.interrupt_socket:
                        continue
                    elif _socket == self.s_termin_io:
                        try:
                            logging.info("client s_termin_io target")
                            sockfd, addr = _socket.accept()
                            self.io = sockfd
                            self.sockets.append(self.io)
                            data = self.io.recv(4096)
                            if data:
                                self.client_socket.send(data)
                        except:
                            self.io.close()
                            logging.info("socket err, einfo {}".format(einfo()))
                    elif _socket == self.io:
                        data = self.io.recv(4096)
                        logging.info("client io send {}".format(data))
                        if data:
                            self.client_socket.send(data)
                    else:
                        data = _socket.recv(4096)
                        if data:
                            logging.info("data: {}".format(data))

                    # send msg
                    # elif _socket == self.local_socket_server:
                    #     msg = _socket.recv(4096)
                    #     self.client_socket.send(msg)
                    # else:
                        # msg = sys.stdin.readline()
                        # self.client_socket.send(msg)
                        # send message to server
                    #    msg = _socket.recv(4096)
                    #    self.client_socket.send(msg)
        finally:
            self.end()