|
2 | 2 | import threading |
3 | 3 | import json |
4 | 4 | import sys, time, signal |
| 5 | +import logging, coloredlogs |
| 6 | + |
| 7 | +from PyQt5 import QtWidgets |
| 8 | +from PyQt5.QtCore import pyqtSignal, QObject, pyqtSlot |
| 9 | + |
| 10 | +from form_main import Ui_SocketChat |
| 11 | +from ui_events import UI_Events |
| 12 | + |
| 13 | +FIELD_STYLES = dict( |
| 14 | + asctime=dict(color='green'), |
| 15 | + hostname=dict(color='magenta'), |
| 16 | + levelname=dict(color='green'), |
| 17 | + filename=dict(color='magenta'), |
| 18 | + name=dict(color='yellow'), |
| 19 | + threadName=dict(color='green') |
| 20 | +) |
| 21 | + |
| 22 | +LEVEL_STYLES = dict( |
| 23 | + debug=dict(color='green'), |
| 24 | + info=dict(color='cyan'), |
| 25 | + verbose=dict(color='blue'), |
| 26 | + warning=dict(color='yellow'), |
| 27 | + error=dict(color='red'), |
| 28 | + critical=dict(color='red', bold=coloredlogs.CAN_USE_BOLD_FONT) |
| 29 | +) |
| 30 | + |
| 31 | +FORMAT = '[%(asctime)-15s] %(filename)s[%(process)d] : %(message)s' |
| 32 | +logging.basicConfig(format=FORMAT) |
| 33 | + |
| 34 | +logger = logging.getLogger(__name__) |
| 35 | +coloredlogs.install( |
| 36 | + fmt=FORMAT, |
| 37 | + level='DEBUG', |
| 38 | + logger=logger, |
| 39 | + level_styles=LEVEL_STYLES, |
| 40 | + field_styles=FIELD_STYLES,) |
| 41 | + |
5 | 42 |
|
6 | 43 | HOST = '10.90.4.109' |
7 | 44 | PORT = 80 |
|
10 | 47 |
|
11 | 48 | class SocketClient(object): |
12 | 49 | def __init__(self, *args, **kwargs): |
13 | | - self.stop = False |
| 50 | + self.is_connected = False |
| 51 | + self.status = True |
14 | 52 | self.s = socket.socket() |
15 | 53 | self.threads = [] |
16 | | - if 'username' not in kwargs: |
17 | | - print('[i] Kullanıcı adı tanımlanmadı.') |
| 54 | + self.username = None |
| 55 | + |
| 56 | + # if 'username' not in kwargs: |
| 57 | + # logger.error('[i] Kullanıcı adı tanımlanmadı.') |
| 58 | + # else: |
| 59 | + # self.username = kwargs['username'] |
| 60 | + |
| 61 | + if 'ui' not in kwargs: |
| 62 | + logger.error('UI not defined!') |
| 63 | + else: |
| 64 | + self.ui = kwargs['ui'] |
| 65 | + |
| 66 | + |
| 67 | + if 'signals' not in kwargs: |
| 68 | + logger.error('signals not defined!') |
18 | 69 | else: |
19 | | - self.username = kwargs['username'] |
| 70 | + self.signals = kwargs['signals'] |
| 71 | + |
20 | 72 |
|
21 | | - self.s.connect((HOST, PORT)) |
| 73 | + # self.s.settimeout(1.0) |
| 74 | + |
| 75 | + def connect(self): |
| 76 | + if not self.is_connected: |
| 77 | + self.s = socket.socket() |
| 78 | + logger.info('Connecting...') |
| 79 | + try: |
| 80 | + self.s.connect((HOST, PORT)) |
| 81 | + self.is_connected = True |
| 82 | + except ConnectionRefusedError: |
| 83 | + logger.error('Connection Refused!') |
| 84 | + self.is_connected = False |
| 85 | + except ConnectionAbortedError: |
| 86 | + logger.error('Connection Aborted!') |
| 87 | + self.is_connected = False |
| 88 | + except ConnectionResetError: |
| 89 | + logger.error('Connection Reset!') |
| 90 | + self.is_connected = False |
| 91 | + else: |
| 92 | + logger.info('Already Connected') |
22 | 93 |
|
| 94 | + def set_username(self, username): |
| 95 | + self.username = username |
23 | 96 | data = {'action': 'connect', 'username': self.username, 'message': ''} |
24 | 97 | self.s.send(json.dumps(data).encode('utf-8')) |
| 98 | + logger.info('Username set') |
| 99 | + |
| 100 | + # def show_dialog(self, txt): |
| 101 | + # msg = QMessageBox() |
| 102 | + # msg.setIcon(QMessageBox.Information) |
| 103 | + # msg.setText(txt) |
| 104 | + # msg.setWindowTitle("Dialog") |
| 105 | + # msg.exec_() |
| 106 | + |
| 107 | + def on_connect(self, user_data): |
| 108 | + username = user_data['username'] |
| 109 | + status = user_data['status'] |
| 110 | + message = user_data['message'] |
| 111 | + |
| 112 | + if username == 'server' and status: |
| 113 | + self.signals.signal_on_connect.emit() |
| 114 | + self.signals.signal_on_message.emit('[{0}]: {1}'.format(username, message)) |
| 115 | + elif username == 'server' and not status: |
| 116 | + self.signals.signal_on_message.emit('[{0}]: {1}'.format(username, message)) |
| 117 | + |
| 118 | + def on_disconnect(self, user_data): |
| 119 | + username = user_data['username'] |
| 120 | + status = user_data['status'] |
| 121 | + message = user_data['message'] |
| 122 | + |
| 123 | + if username == 'server' and status: |
| 124 | + self.signals.signal_on_disconnect.emit() |
| 125 | + self.signals.signal_on_message.emit('[{0}]: {1}'.format(username, message)) |
| 126 | + |
| 127 | + logger.info('Disconnect oldum') |
| 128 | + return True |
| 129 | + |
| 130 | + def on_message(self, user_data): |
| 131 | + username = user_data['username'] |
| 132 | + message = user_data['message'] |
| 133 | + |
| 134 | + self.signals.signal_on_message.emit('[{0}]: {1}'.format(username, message)) |
| 135 | + |
| 136 | + def on_user_list(self, user_data): |
| 137 | + usernames = user_data['message'] |
| 138 | + |
| 139 | + self.signals.signal_on_user_list.emit(usernames) |
25 | 140 |
|
26 | 141 | def listen(self): |
27 | | - while not self.stop: |
| 142 | + while self.status : |
| 143 | + logger.info('Dinliyorum') |
| 144 | + # try: |
28 | 145 | data = self.s.recv(1024).decode("utf-8") |
29 | 146 | j_data = json.loads(data) |
30 | | - with lock: |
31 | | - print('\r[{0}]: {1}\n\r[->]: '.format(j_data['username'], j_data['message']), end='', flush=True) |
| 147 | + action = j_data['action'] |
32 | 148 |
|
33 | | - |
34 | | - def talk(self): |
35 | | - while not self.stop: |
36 | | - msg = input('[->]: ') |
37 | | - data = {'action': 'chat', 'username': self.username, 'message': msg} |
38 | | - self.s.send(json.dumps(data).encode('utf-8')) |
| 149 | + logger.info(j_data) |
| 150 | + |
| 151 | + if action == 'connect': |
| 152 | + self.on_connect(j_data) |
| 153 | + elif action == 'user_list': |
| 154 | + self.on_user_list(j_data) |
| 155 | + elif action == 'disconnect': |
| 156 | + if self.on_disconnect(j_data): |
| 157 | + self.is_connected = False |
| 158 | + break |
| 159 | + else: |
| 160 | + self.on_message(j_data) |
| 161 | + |
| 162 | + # except IOError: |
| 163 | + # continue |
| 164 | + self.s.close() |
| 165 | + |
| 166 | + def talk(self, message): |
| 167 | + if self.is_connected: |
| 168 | + logger.info('message : {0}'.format(message)) |
| 169 | + try: |
| 170 | + data = {'action': 'chat', 'username': self.username, 'message': message} |
| 171 | + self.s.send(json.dumps(data).encode('utf-8')) |
| 172 | + except ConnectionRefusedError: |
| 173 | + logger.error('Connection Refused!') |
| 174 | + except ConnectionAbortedError: |
| 175 | + logger.error('Connection Aborted!') |
| 176 | + except ConnectionResetError: |
| 177 | + logger.error('Connection Reset!') |
| 178 | + else: |
| 179 | + logger.error("Not Connected!") |
| 180 | + |
| 181 | + def disconnect(self): |
| 182 | + if self.is_connected: |
| 183 | + logger.info('{} request disconnect'.format(self.username)) |
| 184 | + try: |
| 185 | + data = {'action': 'disconnect', 'username': self.username, 'message': ''} |
| 186 | + self.s.send(json.dumps(data).encode('utf-8')) |
| 187 | + except ConnectionRefusedError: |
| 188 | + logger.error('Connection Refused!') |
| 189 | + except ConnectionAbortedError: |
| 190 | + logger.error('Connection Aborted!') |
| 191 | + except ConnectionResetError: |
| 192 | + logger.error('Connection Reset!') |
| 193 | + else: |
| 194 | + logger.error("Not Connected!") |
39 | 195 |
|
40 | 196 | def start(self): |
41 | | - t = threading.Thread(target=self.listen) |
42 | | - self.threads.append(t) |
43 | | - t.start() |
44 | | - print("[i] Dinliyorum") |
45 | | - |
46 | | - t = threading.Thread(target=self.talk) |
47 | | - self.threads.append(t) |
48 | | - t.start() |
49 | | - print("[i] Konuşuyorum...") |
| 197 | + if self.is_connected: |
| 198 | + t = threading.Thread(target=self.listen) |
| 199 | + self.threads.append(t) |
| 200 | + t.start() |
| 201 | + logger.info("Dinleme başladı") |
| 202 | + |
| 203 | + # t = threading.Thread(target=self.talk) |
| 204 | + # self.threads.append(t) |
| 205 | + # t.start() |
| 206 | + # logger.info("[i] Konuşuyorum...") |
| 207 | + |
| 208 | + # signal.signal(signal.SIGINT, self.signal_handler) |
| 209 | + |
| 210 | + # while True: |
| 211 | + # time.sleep(1) |
| 212 | + else: |
| 213 | + logger.error("Not Connected!") |
| 214 | + |
| 215 | + def stop(self): |
| 216 | + logger.warning('Stop çağırıldı.') |
| 217 | + self.disconnect() |
| 218 | + self.status = False |
| 219 | + # self.s.close() |
| 220 | + for i in self.threads: |
| 221 | + i.join() |
| 222 | + |
| 223 | + logger.info('Finito!') |
| 224 | + |
| 225 | + def signal_handler(self, signal, frame): |
| 226 | + logger.warning('You pressed Ctrl+C!') |
| 227 | + self.stop() |
| 228 | + sys.exit() |
| 229 | + |
| 230 | +class Communicate(QObject): |
50 | 231 |
|
| 232 | + signal_on_message = pyqtSignal(str) |
| 233 | + signal_on_connect = pyqtSignal() |
| 234 | + signal_on_disconnect = pyqtSignal() |
| 235 | + signal_on_user_list = pyqtSignal(object) |
| 236 | + signal_clear_user_list = pyqtSignal() |
51 | 237 |
|
52 | | -def main(uname): |
53 | | - myClient = SocketClient(username=uname) |
54 | | - myClient.start() |
| 238 | + def __init__(self): |
| 239 | + QObject.__init__(self) |
| 240 | + # self._message = None |
| 241 | + |
| 242 | + # @property |
| 243 | + # def message(self): |
| 244 | + # return self._message |
| 245 | + |
| 246 | + # @message.setter |
| 247 | + # def message(self, new_msg): |
| 248 | + # self._message = new_msg |
| 249 | + # self.signal_on_message.emit(new_msg) |
55 | 250 |
|
56 | 251 | if __name__ == '__main__': |
57 | | - main(sys.argv[1]) |
| 252 | + app = QtWidgets.QApplication(sys.argv) |
| 253 | + MainWindow = QtWidgets.QMainWindow() |
| 254 | + ui = Ui_SocketChat() |
| 255 | + ui.setupUi(MainWindow) |
| 256 | + |
| 257 | + signals = Communicate() |
| 258 | + myClient = SocketClient(ui=ui, signals=signals) |
| 259 | + events = UI_Events(app, ui, myClient) |
| 260 | + |
| 261 | + |
| 262 | + signals.signal_on_message.connect(events.on_message) |
| 263 | + signals.signal_on_connect.connect(events.on_connect) |
| 264 | + signals.signal_on_disconnect.connect(events.on_disconnect) |
| 265 | + signals.signal_on_user_list.connect(events.on_user_list) |
| 266 | + |
| 267 | + ui.btn_connect.clicked.connect(events.btn_connect_clicked) |
| 268 | + ui.btn_disconnect.clicked.connect(events.btn_disconnect_clicked) |
| 269 | + |
| 270 | + ui.actionConnect.triggered.connect(events.btn_connect_clicked) |
| 271 | + ui.actionDisconnect.triggered.connect(events.btn_disconnect_clicked) |
| 272 | + ui.actionClose.triggered.connect(events.on_close) |
| 273 | + |
| 274 | + ui.btn_send.clicked.connect(events.btn_send_clicked) |
| 275 | + ui.txt_message.returnPressed.connect(events.txt_message_enter) |
| 276 | + |
| 277 | + ui.btn_disconnect.setVisible(False) |
| 278 | + ui.actionDisconnect.setVisible(False) |
| 279 | + |
| 280 | + ui.statusbar.showMessage('Disconnected') |
| 281 | + ui.txt_message.setReadOnly(True) |
| 282 | + |
| 283 | + MainWindow.closeEvent = events.closeEvent |
| 284 | + |
| 285 | + myClient.connect() |
| 286 | + |
| 287 | + MainWindow.show() |
| 288 | + sys.exit(app.exec_()) |
| 289 | + |
0 commit comments