#! /usr/bin/env python # encoding:utf-8 """ @author: DYS @file: Gserver.py @time: 2018/4/20 13:40 """ import socket from db import DB from threading import currentThread, Thread class HandlerThread(object): queue = [] # sockect éå db = DB() def __init__(self, sock): self.sock = sock def recv(self): data = self.sock.recv(1024).strip() # å¦æä½¿ç¨ while æ¥æ¶æ°æ®æ¶ï¼ä¼å¯¼è´ç¨æ·å¿ 须夿²ä¸æ¬¡åè½¦é® return data.decode('utf-8') def send(self, data): # self.sock.sendall(('[System]: %s' % data).encode('utf-8')) self.sock.send(data.encode('utf-8')) # sendä¼ çæ¯bytesï¼æä»¥è¦è¦encodeç¼ç ä¸ä¸ # åéåä¸å¹¿ææ¶æ¯ def broadcast(self, user, data): for sock in self.queue: sock.sendall('\n[%s]: %s\n' % (user, data)) # å ³é客æ·ç«¯è¿æ¥ def stop(self): self.send('ByeBye!') self.sock.close() self.queue.remove(self.sock) # å ³éè¿æ¥åï¼è®°å¾ä»éåä¸å é¤ # ç¨åºå ¥å£ def handler(self): funcdict = { 'login': self.login, 'register': self.register } try: thname = currentThread().getName() print('[%s] Got connection from %s' % (thname, self.sock.getpeername())) # 该ç¨åºä¸ææ print çæ°æ®ï¼å°å ¨é¨ä½¿ç¨ loging 模åä»£æ¿ self.send('请è¾å ¥ä½ è¦éæ©çåè½ï¼login/register/exit') data = self.recv() # print("data:", data) if data == 'exit': self.stop() # å ¶å®è¿éåºè¯¥åç¬ä½¿ç¨ self.sock.close() æ¥å ³éè¿æ¥ï¼å ä¸ºè¿æ¶éåä¸å¹¶æ²¡æè¯¥è¿æ¥ï¼ä¸è¿æäºä¸é¢çæè·å°±æ²¡æé®é¢äº ^_^ elif data in funcdict: # print("jinalile...") return funcdict.get(data)() else: self.handler() except Exception as e: # 妿è¿é䏿è·ä¸ä¸ï¼å°±æ æ³æ£å¸¸æå¼å®¢æ·ç«¯è¿æ¥ print("åçå¼å¸¸ï¼ï¼ï¼å¼å¸¸ä¿¡æ¯ä¸ºï¼", e) # å¤çç¨æ·ç»é def login(self): self.send('Login... 请è¾å ¥ç¨æ·åå¯ç ï¼æ ¼å¼ï¼User Passwordï¼è¾å ¥ Server: æ§è¡ç¨åºæä»¤ï¼') user_data = self.recv() # ç¨åºå 鍿令 if user_data == 'Server:': self.send('\n\tServer:use reged\t忢尿³¨å页\n\tServer:exit\t\téåºç³»ç»') user_data = self.recv() if user_data == 'Server:use reged': self.register() elif user_data == 'Server:exit': self.stop() else: self.send('è¾å ¥é误...') datalist = user_data.split() # å¤æç¨æ·è¾å ¥ï¼æ ¼å¼æ¯å¦æ£ç¡® if len(datalist) == 2: user = datalist[0] password = datalist[1] db_data = self.db.get_data() or {} if user in db_data and password == db_data.get(user): self.queue.append(self.sock) # ææéç»éç³»ç»è ï¼è¿æ¥è¢«å å ¥å°éåä¸ self.send('欢è¿å å ¥è天室ï¼è¾å ¥ Server: è·ååè½æ¹æ³ï¼') self.broadcast('System', '[%s] å å ¥è天室ï¼' % user) self.chat_room(user) else: self.send('ç¨æ·åãå¯ç é误ï¼') self.login() self.login() def register(self): self.send('Register... 请è¾å ¥ç¨æ·åå¯ç ï¼æ ¼å¼ï¼User Passwordï¼è¾å ¥ Server: æ§è¡ç¨åºæä»¤ï¼') user_data = self.recv() if user_data == 'Server:': self.send('\n\tServer:use login\t忢尿³¨å页\n\tServer:exit\t\téåºç³»ç»') user_data = self.recv() if user_data == 'Server:login': self.login() elif user_data == 'Server:exit': self.stop() else: self.send('è¾å ¥é误...') datalist = user_data.split() if len(datalist) == 2: user = datalist[0] password = datalist[1] db_data = self.db.get_data() or {} if user in db_data: self.send('è¯¥ç¨æ·å已被注åï¼') self.register() else: db_data[user] = password self.db.put_data(db_data) self.queue.append(self.sock) self.broadcast('System', 'æ°ç¨æ· [%s] å å ¥è天室ï¼' % user) self.chat_room(user) self.register() def chat_room(self, user): user_data = self.recv() if user_data == 'Server:': self.send('\n\tServer:logout\téåºè天室') user_data = self.recv() if user_data == 'Server:logout': self.stop() return # è¿é妿ä¸å return ï¼ä¼å°å®¢æ·ç«¯æ§è¡ç Server: æä»¤ä¹å¹¿æåºå» else: self.send('è¾å ¥é误...') self.chat_room(user) else: self.broadcast(user, user_data) self.chat_room(user) # 为æ¯è¿æ¥åå»ºçº¿ç¨ def Startthread(sock, addr): print('Received new client connection. %s:%s' % (addr[0], addr[1])) th = HandlerThread(sock) t = Thread(target=th.handler) t.setDaemon(True) t.start() # å¯å¨æå¡ def Server(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('127.0.0.1', 17170)) s.listen(5) while True: try: sock, addr = s.accept() except KeyboardInterrupt: exit('\nByeBye!') Startthread(sock, addr) s.close() if __name__ == '__main__': Server()