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
|
#!/usr/bin/env python3
'''
Created on 29.3.2017
@author: T
'''
import socket
import time
from time import gmtime, strftime
import threading
import signal
from datetime import datetime
import sys
DEFAULT_HOST = "127.0.0.1"
PORT = 5000
DEFAULT_NICK = "Anonymous"
BUFFER_SIZE = 1024
DEBUG = False
running = True
print_lock = threading.Lock()
def t_print(string):
with print_lock:
print(string)
def debug(string):
if (DEBUG):
t_print("{} DEBUG: {}".format(datetime.now(), string))
def signal_handler(signal, frame):
t_print("Closing sockets and shutting down...")
global running
running = False
disconnect()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
def connect(host, nick):
msg = "CONNECT\n" + nick + "\n\0"
s.connect((host, 5000))
debug("connected")
s.send(msg.encode(encoding='utf_8'))
def disconnect():
msg = "DISCONNECT\n" + nick + "\n\0"
s.send(msg.encode(encoding='utf_8'))
def send_message(viesti):
msg = "MESSAGE\n" + nick + "\n" + viesti + "\0"
s.send(msg.encode(encoding='utf_8'))
def keep_alive():
debug("laskuri started")
while running:
# kikka kakkonen sille, että ohjelman sulkeutuminen tarkistetaan sekuntin välein
# 10 sekuntin sijaan
for i in range(10):
if not running:
break
time.sleep(1)
msg = "KEEPALIVE\n" + nick + "\n\0"
s.send(msg.encode(encoding='utf_8'))
debug("10 sekuntia meni -> KEEPALIVE")
def listen_messages():
debug("kuuntelija started")
while running:
rec = s.recv(BUFFER_SIZE).decode()
osat = rec.split("\n")
if osat[0] == "BROADCAST":
username = osat[1]
body = osat[2]
debug(username)
debug(body)
if username != nick:
timestamp = strftime("%H:%M:%S", gmtime())
t_print("{} {}: {}".format(timestamp, username, body))
host = input("Host [{}]: ".format(DEFAULT_HOST))
nick = input("Nickname [{}]: ".format(DEFAULT_NICK))
if len(host) == 0:
host = DEFAULT_HOST
if len(nick) == 0:
nick = DEFAULT_NICK
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect(host, nick)
#luodaan laskuri
laskuri = threading.Thread(target=keep_alive, args=())
laskuri.start()
#luodaan viestien kuuntelija
kuuntelija = threading.Thread(target=listen_messages, args=())
kuuntelija.start()
#odotetaan kayttajan kirjoittavan viestin tai lopettavan ohjelman -quit-komennolla
t_print("Type '-quit' to exit.")
while running:
syote = input()
if syote == "-quit":
disconnect()
running = False
break
else:
send_message(syote)
#Yrityksia poistaa kayttajan syote koska tulee muuten kahteen kertaan
#print("", end="\r")
#sys.stdout.write("\r")
debug("Stopped")
|