Skip to content

Commit 4704d9d

Browse files
authored
Form changed to QDialog to QMainWindow
Form changed to QDialog to QMainWindow Created events class
1 parent 82e193a commit 4704d9d

5 files changed

Lines changed: 706 additions & 55 deletions

File tree

client.py

Lines changed: 259 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,43 @@
22
import threading
33
import json
44
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+
542

643
HOST = '10.90.4.109'
744
PORT = 80
@@ -10,48 +47,243 @@
1047

1148
class SocketClient(object):
1249
def __init__(self, *args, **kwargs):
13-
self.stop = False
50+
self.is_connected = False
51+
self.status = True
1452
self.s = socket.socket()
1553
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!')
1869
else:
19-
self.username = kwargs['username']
70+
self.signals = kwargs['signals']
71+
2072

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')
2293

94+
def set_username(self, username):
95+
self.username = username
2396
data = {'action': 'connect', 'username': self.username, 'message': ''}
2497
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)
25140

26141
def listen(self):
27-
while not self.stop:
142+
while self.status :
143+
logger.info('Dinliyorum')
144+
# try:
28145
data = self.s.recv(1024).decode("utf-8")
29146
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']
32148

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!")
39195

40196
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):
50231

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

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

56251
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

Comments
 (0)