/
02.voting_server.py
77 lines (60 loc) · 2.36 KB
/
02.voting_server.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
# import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCServer
# import SimpleXMLRPCRequestHandler
from xmlrpc.server import SimpleXMLRPCRequestHandler
import threading
# Batasi hanya pada path /RPC2 saja supaya tidak bisa mengakses path lainnya
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Buat server
with SimpleXMLRPCServer(("192.168.43.122", 54321),
requestHandler=RequestHandler, allow_none=True) as server:
server.register_introspection_functions()
# buat data struktur dictionary untuk menampung nama_kandidat dan hasil voting
kandidat = {'candidate_1': 0, 'candidate_2': 0}
# kode setelah ini adalah critical section, menambahkan vote tidak boeh terjadi race condition
# siapkan lock
lock = threading.Lock()
# buat fungsi bernama vote_candidate()
def vote_candidate(nama):
# critical section dimulai harus dilock
lock.acquire()
# jika kandidat ada dalam dictionary maka tambahkan nilai votenya
if kandidat.get(nama) != None:
kandidat[nama] = kandidat[nama] + 1
msg = "anda telah memilih " + nama
lock.release()
return msg
else:
lock.release()
msg = "Anda memilih kandidat yang tidak terdapat dalam list"
return msg
# critical section berakhir, harus diunlock
lock.release()
# register fungsi vote_candidate() sebagai vote
server.register_function(vote_candidate, 'vote_candidate')
# buat fungsi bernama querry_result
def querry_result():
# critical section dimulai
lock.acquire()
# hitung total vote yang ada
total = 0
for i in kandidat:
total = total + kandidat[i]
if total == 0:
lock.release()
return "nama yang anda pilih tidak terdaftar"
# hitung hasil persentase masing-masing kandidat
presentase = []
msg = ""
for i in kandidat:
hasil_vote = (kandidat[i] / total) * 100
msg = msg + i + "memperoleh " + str(hasil_vote) + "%\n"
# critical section berakhir
lock.release()
return msg
# register querry_result sebagai querry
server.register_function(querry_result, 'lihat')
print("Server voting berjalan...")
# Jalankan server
server.serve_forever()