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()
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()