def recvfrom_user(self, time, target, sender, cmd, recv_args, ): ''' time : 见recvfrom_server target: 见recvfrom_server sender: 消息发送者的名字 cmd : 见recvfrom_server recv_args: 见recvfrom_server ''' # print("sender:%s,cmd:%s,recv_args:%s" % (sender, cmd, recv_args)) if cmd == 'chatdata': # 聊天信息 content = recv_args if target.dtype == 'user': # 发送给个人的 msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.CHAT_ORGIN_DATA, msg=(sender, content)) self.send_queue.put(msg) else: # 群聊 print(formattime(time), sender, '[%s]:\n' % target.name, content) if cmd == 'mkfriend': # 有人向你请求添加好友,参数为好友名 # print(sender, '请求添加你为好友,是否同意 Y/N') # print('') # 同意,不同意则不理睬 # self.make_friend(sender) msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ADDFRIEND, msg=['add_recv', sender]) self.send_queue.put(msg)
def connect_server(self): try: msg = MsgType(type=MsgType.MSG_SOCKET, msgtype=MsgType.SUCCESS) self.client = netClient.ClientNet(application.server_addr, application.rev_msg_queue) except: msg.msgtype = MsgType.FAILURE time.sleep(1) else: msg.msgtype = MsgType.SUCCESS finally: application.dlg_msg_queue.put(msg)
def loginDlgClickLogin(self): username = self.loginDlg.usernamelineEdit.text() passwd = self.loginDlg.passwdlineEdit.text() if username == '' or passwd == '': QtWidgets.QMessageBox.information(self.registerDlg, '提示', '用户名密码不能为空', QtWidgets.QMessageBox.Ok) else: msg = MsgType(type=MsgType.MSG_LOGIN,msgtype=MsgType.USER_DATA,msg = {'username':username,'passwd':passwd}) self.send_queue.put(msg)
def registerDlgClickRegister(self): username = self.registerDlg.usernamelineEdit.text() passwd = self.registerDlg.passwdlineEdit.text() passwdsure = self.registerDlg.passwdsurelineEdit.text() if username == '' or passwd == '' or passwdsure == '': QtWidgets.QMessageBox.information(self.registerDlg, '提示', '用户名密码不能为空', QtWidgets.QMessageBox.Ok) elif passwd != passwdsure: QtWidgets.QMessageBox.information(self.registerDlg, '提示', '两次密码不一致', QtWidgets.QMessageBox.Ok) else: msg = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.USER_DATA,msg={'username': username, 'passwd': passwd}) self.send_queue.put(msg)
def handle_rev_queue(self): if not self.rev_queue.empty(): msg = self.rev_queue.get() if msg.type == MsgType.MSG_SYS: if msg.msgtype == MsgType.EXIT: sys.exit(msg.msg) elif msg.type == MsgType.MSG_SOCKET: if msg.msgtype == MsgType.FAILURE: self.server_connect_display(True) else: self.server_connect_display(False) elif msg.type == MsgType.MSG_REGISTER: d = {MsgType.FAILURE:'注册失败',MsgType.SUCCESS:'注册成功'} QtWidgets.QMessageBox.information(self.registerDlg, '提示', d[msg.msgtype], QtWidgets.QMessageBox.Ok) elif msg.type == MsgType.MSG_LOGIN: if msg.msgtype == MsgType.FAILURE: QtWidgets.QMessageBox.information(self.loginDlg, '提示', '登录失败', QtWidgets.QMessageBox.Ok) else: m = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.USER_DATA,msg={'username': self.loginDlg.usernamelineEdit.text(), 'passwd': self.loginDlg.passwdlineEdit.text()}) self.send_queue.put(m) QtCore.QCoreApplication.instance().quit()
def sys_exit(self): m = MsgType(type=MsgType.MSG_SYS, msgtype=MsgType.EXIT, msg=0) application.net_msg_queue.put(m) application.rev_msg_queue.put(m) application.dlg_msg_queue.put(m)
def recvfrom_server(self, time, target, cmd, send_args, recv_args): ''' 主要有些函数,比如查询某个组内成员,需要知道发送的什么参数。 所以有个send_args的变量,不知道怎么用就打印出来看看就知道来了 time: 为了时间同步问题,所以时间全部都是服务器上获取的(不然某一客户端改了本地时间就全乱了) 离线信息的时间为系统存储离线信息的时间 target: 消息的目标位置,客户端收到的现在有两个属性 group 和 user ,如果为user则是发送给本人的 如果为group,则需要判断是发给哪个群组的。 cmd: 表明是哪个消息的返回 send_args: 为了方便客户端处理,客户端发送的参数也一并被带下来了 recv_args: 指令处理的结果 ''' print('time:%s,target:%s,cmd:%s,send:%s,recv:%s' % (formattime(time), target, cmd, send_args, recv_args)) if cmd == 'sign_up': # 注册结果 msg = MsgType(type=MsgType.MSG_REGISTER,msgtype=MsgType.SUCCESS if recv_args else MsgType.FAILURE) self.send_queue.put(msg) if cmd == 'sign_in': # 登录结果 if recv_args != False: self.user = recv_args msg = MsgType(type=MsgType.MSG_LOGIN, msgtype=MsgType.SUCCESS if recv_args else MsgType.FAILURE) self.send_queue.put(msg) if cmd == 'make_friend': # 如果拒绝则不会返回,这里返回False的原因是: # 1.两者中有一个不是用户 # 2.双方已经是好友了 result, userA, userB = recv_args # A为发起者 msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ADDFRIEND,msg=['add_res',result,userA,userB]) self.send_queue.put(msg) if cmd == 'delete_friend': # 如果失败则说明双方不是好友 # A删除B result, userA, userB = recv_args if self.user == userA: msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.DELFRIEND, msg=['del_res', result, userA, userB]) self.send_queue.put(msg) else: msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.DELFRIEND, msg=['del_ret', result, userA, userB]) self.send_queue.put(msg) if cmd == 'get_friends': data = [] groupList = [] self.is_online(recv_args) for i in recv_args: if recv_args[i] not in groupList: groupList.append(recv_args[i]) data.append([recv_args[i],[i]]) else: for group in data: if group[0] == recv_args[i]: group[1].append(i) msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.FRIENDLIST,msg=json.dumps(data)) self.send_queue.put(msg) if cmd == 'get_groups': group_list = recv_args print('群组列表:', group_list) for group in group_list: self.group_get_member(group) if cmd == 'group_create': # send_args:group_name,members # recv_args:True/False group_name, members = send_args result = recv_args print('创建组{}:{} {}'.format(group_name, members, fmt(recv_args))) # 测试获取组员 # self.group_get_member(group_name) # 测试添加组员 self.group_append(group_name, 'antony') # 测试发送组消息 self.send_data(UserID('group', group_name), 'hello,everyone') # #测试删除组员 # self.group_delete(group_name,'a') # #测试删除群 # self.group_drop(group_name) # 测试群转让 # self.group_transfer(group_name,'antony') if cmd == 'group_drop': group_name, user = send_args result = recv_args print('{}删除组{}:'.format(user, group_name, fmt(result))) if cmd == 'group_get_member': group_name = send_args[0] group_list = recv_args print('获取到了组员', group_name, group_list) if cmd == 'group_append': group_name, new_member = send_args result = recv_args print('群{}添加{}{}'.format(group_name, new_member, fmt(result))) if cmd == 'group_delete': group_name, admin, old_member = send_args result = recv_args print('群{},{}删除{}{}'.format(group_name, admin, old_member, fmt(result))) if cmd == 'group_transfer': group_name, old_admin, new_admin = send_args result = recv_args if result == True: print('{}成功把群{}转让给了{}'.format(old_admin, group_name, new_admin)) else: print('{}想把群{}转让给{},但是失败了'.format(old_admin, group_name, new_admin)) if cmd == 'get_user': regexp, start, stop = send_args result = recv_args if start == None: start = '' if stop == None: stop = '' print('所有用户:"%s"[%s:%s:1]=%s' % (regexp, start, stop, result)) if cmd == 'get_online_user': regexp, start, stop = send_args result = recv_args if start == None: start = '' if stop == None: stop = '' print('在线用户:"%s"[%s:%s:1]=%s' % (regexp, start, stop, result)) if cmd == 'is_online': user_list = send_args result_list = recv_args msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ONLINE, msg=zip(user_list,result_list)) self.send_queue.put(msg) if cmd == 'go_online': # 好友上线通知 msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ONLINE, msg=[(recv_args,True)]) self.send_queue.put(msg) if cmd == 'go_offline': # 好友下线通知 msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ONLINE, msg=[(recv_args,False)]) self.send_queue.put(msg) if cmd == 'group_and_members': # 上线时,服务器主动下发组和组内成员 #{'group1':m1,m2,..],'group2':[m1,m2,...]} group_list = recv_args print('群-成员表') # msg = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.SUCCESS if recv_args else MsgType.FAILURE) # self.send_queue.put(msg) for group in group_list: print("%s:\n\t%s" % (group, group_list[group])) if cmd == 'distribute_belong': user,friend,belong = send_args # result = recv_args # print('已变更%s为"%s"'%(friend,belong)) msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ADDFRIEND, msg=['change_belong_res', friend,belong,recv_args]) self.send_queue.put(msg)
def closeEvent(self, QCloseEvent): msg = MsgType(type=MsgType.MSG_CHAT,msgtype=MsgType.CLOSE_DLG,msg = self.targetname) self.send_queue.put(msg)
def closeEvent(self, QCloseEvent): msg = MsgType(type=MsgType.MSG_CALENDAR,msgtype=MsgType.CLOSE_DLG,msg = os.getpid()) self.send_queue.put(msg)
def TetrisButton_clicked(self): if MsgType.TETRIS_DLG not in self.dlgstate: self.dlgstate.append(MsgType.TETRIS_DLG) msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.TETRIS_DLG) self.send_queue.put(msg)
def snackButton_clicked(self): if MsgType.SNACK_DLG not in self.dlgstate: self.dlgstate.append(MsgType.SNACK_DLG) msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.SNACK_DLG) self.send_queue.put(msg)
def calendarButton_clicked(self): if MsgType.CALENDAR_DLG not in self.dlgstate: self.dlgstate.append(MsgType.CALENDAR_DLG) msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.CALENDAR_DLG) self.send_queue.put(msg)
def weatherButton_clicked(self): if MsgType.WEATHER_DLG not in self.dlgstate: self.dlgstate.append(MsgType.WEATHER_DLG) msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.WEATHER_DLG) self.send_queue.put(msg)
def register_close_event(self): msg_dict = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.CLOSE_DLG) self.send_queue.put(msg_dict)
def login_close_event(self): msg_dict = MsgType(type=MsgType.MSG_LOGIN,msgtype=MsgType.CLOSE_DLG) self.send_queue.put(msg_dict)
def handleMsg(self): if not application.rev_msg_queue.empty(): msg = application.rev_msg_queue.get() print('main:', msg) if msg.type == MsgType.MSG_SYS: if msg.msgtype == MsgType.EXIT: self.join_all() if self.client: self.client.close() sys.exit(msg.msg) elif msg.type == MsgType.MSG_LOGIN: if msg.msgtype == MsgType.CLOSE_DLG: self.sys_exit() elif msg.msgtype == MsgType.USER_DATA: try: self.client.sign_in(msg.msg['username'], msg.msg['passwd']) except (IOError, AttributeError): m = MsgType(type=MsgType.MSG_LOGIN, msgtype=MsgType.FAILURE) self.dlg_msg_queue.put(m) self.unconnect_server() except Exception as e: print(e) elif msg.msgtype in [MsgType.SUCCESS, MsgType.FAILURE]: application.dlg_msg_queue.put(msg) elif msg.type == MsgType.MSG_REGISTER: if msg.msgtype == MsgType.CLOSE_DLG: self.sys_exit() elif msg.msgtype == MsgType.USER_DATA: try: self.client.sign_up(msg.msg['username'], msg.msg['passwd']) except (IOError, AttributeError): m = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.FAILURE) self.dlg_msg_queue.put(m) self.unconnect_server() except Exception as e: print(e) elif msg.msgtype in [MsgType.SUCCESS, MsgType.FAILURE]: application.dlg_msg_queue.put(msg) elif msg.type == MsgType.MSG_FRIENDLIST: if msg.msgtype == MsgType.CLOSE_DLG: # 好友列表对话框关闭消息 self.sys_exit() if msg.msgtype in [ MsgType.FRIENDLIST, MsgType.ONLINE, MsgType.CHAT_ORGIN_DATA ]: # 转发从socke接收的好友列表消息 application.dlg_msg_queue.put(msg) if msg.msgtype == MsgType.ADDFRIEND: # 加好友的消息 if msg.msg[0] == 'add': # 发起添加好友 self.client.request_friend(msg.msg[2]) if msg.msg[0] in [ 'add_res', 'add_recv', 'change_belong_res' ]: # 添加好友的结果和接受到好友申请 application.dlg_msg_queue.put(msg) if msg.msg[0] == 'change_belong': self.client.distribute_belong(msg.msg[1], msg.msg[2]) if msg.msg[0] in ['add_recv_ret']: self.client.make_friend(msg.msg[1]) if msg.msgtype == MsgType.DELFRIEND: if msg.msg[0] == 'del': self.client.delete_friend(msg.msg[1]) if msg.msg[0] in ['del_res', 'del_ret']: application.dlg_msg_queue.put(msg) if msg.msgtype == MsgType.MOVEFRIEND: if msg.msg[0] == 'move': self.client.distribute_belong() if msg.msgtype == MsgType.CALENDAR_DLG: self.createProcess(myDlg.friendListDlg.create_calendarDlg) if msg.msgtype == MsgType.SNACK_DLG: self.createProcess(snake_main.main) if msg.msgtype == MsgType.WEATHER_DLG: self.createProcess(weatherApp.main) if msg.msgtype == MsgType.CHAT_DLG: s_queue = multiprocessing.Queue(3) r_queue = multiprocessing.Queue(3) chatdlg_id = MsgType.CHAT_DLG + '_%s' % msg.msg[0] p = multiprocessing.Process( target=myDlg.friendListDlg.createChatDlg, args=( r_queue, s_queue, self.client.user, msg.msg[0], ), name=chatdlg_id) p.daemon = True p.start() self.processingList.append([p, r_queue, s_queue]) if msg.msgtype == MsgType.TETRIS_DLG: self.createProcess(tetris.run) if msg.type in [ MsgType.MSG_CALENDAR, MsgType.MSG_SNACK, MsgType.MSG_TETRIS, MsgType.MSG_WEATHER ]: if msg.msgtype == MsgType.CLOSE_DLG: application.dlg_msg_queue.put(msg) elif msg.type == MsgType.MSG_SOCKET: if msg.msgtype == MsgType.CLOSE: self.unconnect_server() if msg.msgtype in [MsgType.FAILURE, MsgType.SUCCESS]: application.dlg_msg_queue.put(msg) elif msg.type == MsgType.MSG_CHAT: p = self.get_chat_processing(MsgType.CHAT_DLG + '_%s' % msg.msg[0]) if p: p[2].put(msg) else: print('no find chat dlg:', msg) else: for i in self.processingList: if not i[1].empty(): msg = i[1].get() if msg.type in [ MsgType.MSG_CALENDAR, MsgType.MSG_WEATHER, MsgType.MSG_SNACK, MsgType.MSG_TETRIS, MsgType.MSG_CHAT ]: if msg.msgtype == MsgType.CLOSE_DLG: i[0].join() self.processingList.remove(i) application.dlg_msg_queue.put(msg) if msg.msgtype == MsgType.CHAT_ORGIN_DATA: self.client.send_data(UserID('user', msg.msg[0]), msg.msg[1])
def closeEvent(self, QCloseEvent): msg_dict = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.CLOSE_DLG) self.send_queue.put(msg_dict) QCloseEvent.ignore()