-
Notifications
You must be signed in to change notification settings - Fork 0
/
ChatApplication_client.py
176 lines (148 loc) · 4.7 KB
/
ChatApplication_client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# -*- coding: utf-8 -*- #
##
# University of the West of Scotland
# Author: Guillermo Siesto Sanchez B00334584
# e-Mail: b00334684 at studentmail.uws.ac.uk
# Date: 2018
# Description: The purpose of this coursework is to develop a distributed
# chat system using a networking library.
#
# ===========
# C L I E N T
# ===========
##
##
# Imports
import logging # Generate a log file to record all the changes made
from socket import socket, AF_INET, SOCK_STREAM
from sys import argv, stdout
import os # For exiting of every thread
import threading # Threading
from ftplib import FTP
##
# Config
logging.basicConfig(level=logging.INFO,
filename='log/ChatApplication_client.log',
format='[%(levelname)s] %(asctime)s %(message)s', )
##
# Inicialization
free = True
grant = 1 # 0 = Superuser ; 1 = Normaluser
connected = False # For wxiting the thread
buffer_size = 12800
server_ip = "localhost"
server_port = 9797
##
# Lock
lock = threading.RLock()
##
# Send a general message to the common room
def send_message(sock):
global connected
try:
while connected:
message = raw_input()
with lock:
sock.sendall(message)
print "\Sending finished"
except ():
print "] Forced exit when sending message"
connected = False
print "} ESTATE of connected:" + format(connected)
exit()
##
# Receive a message thought the socket and process it
def receive_message(sock):
global connected
try:
while connected:
message = sock.recv(buffer_size)
if (message.startswith(">")):
print "] Command received"
with lock:
check_command(sock, message)
else:
if (free):
print message
stdout.flush()
print "\Receiving finished"
except ():
print "] Forced exit when receiving message"
connected = False
print "} ESTATE of connected:" + format(connected)
exit()
def check_command(sock, message):
global connected
global free
global grant
try:
msg = message
print "MESSAGE: " + msg
if msg.startswith(">kick"): # Also using disconnect
print "] You have been Kicked by an administrator"
elif msg.startswith(">info"):
print "SOY UNA INFORMACION MUY BONITA"
stdout.flush() # Clean
elif msg.startswith(">disconnect"):
connected = False
print "} ESTATE of connected:" + format(connected)
print "] You have been disconnected"
elif msg.startswith(">busy"):
print "] You declared yourself as: Busy"
free = False
elif msg.startswith(">free"):
print "] You declared yourself as: Free"
free = True
elif msg.startswith(">changegrant"):
if msg.startswith(">changegrant 0"):
grant = 0
print "] Grant chages to: SuperUser"
elif msg.startswith(">changegrant 1"):
grant = 1
print "] Grant chages to: Normaluser"
else:
print "] ERROR with commands *changegrant* in client side"
else:
print "] ERROR typing commands in client side from server side"
except ():
print "] Exception on command checking"
def exit():
try:
print "] Exit function"
print "} ESTATE of connected:" + format(connected)
except (SystemExit, SystemError):
print "] Forced exit because of (SystemExit) or (SystemError)"
# os._exit(1)
##
# Main
def main(argv):
try:
global server_ip
global server_port
server_ip = argv[1]
server_port = int(argv[2])
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((server_ip, server_port))
global connected
connected = True
print "} ESTATE of connected:" + format(connected)
# ============== 2 Active Threads
# Thread for Sendind
sending_t = threading.Thread(target=send_message, args=(sock,))
# sending_t.daemon = True
sending_t.start()
# Thread for Receiving
receiving_t = threading.Thread(target=receive_message, args=(sock,))
# receiving_t.daemon = True
receiving_t.start()
sending_t.join()
receiving_t.join()
with lock:
sock.close()
exit()
except (KeyboardInterrupt): # ^C Control
print "] Forced exit by (KeyboardInterrupt) exception"
stdout.flush()
logging.info(
"] Forced exit by (KeyboardInterrupt) exception")
main(argv)