-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathszerver.py
More file actions
84 lines (72 loc) · 5.61 KB
/
szerver.py
File metadata and controls
84 lines (72 loc) · 5.61 KB
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
import socket # A socket modul biztosítja a hálózati kommunikációhoz szükséges funkciókat.
import threading # A threading modul lehetővé teszi a párhuzamos szálak futtatását.
# Szerver beállításai
SZERVER_IP = "0.0.0.0" # A szerver minden hálózati interfészen figyel.
SZERVER_PORT = 12345 # A szerver által használt portszám.
kliensek = {} # Egy szótár, amely a kliens azonosítókat és kapcsolódó socketeket tárolja.
def kezeles(kliens_socket, kliens_cim):
"""
Egy kliens kapcsolatának kezelése. Fogadja az üzeneteket a klienstől,
feldolgozza őket, és megfelelő választ ad vissza.
"""
print(f"Kapcsolódott: {kliens_cim}") # A kliens IP címének és portjának kiírása.
kliens_azonosito = None # A kliens azonosítóját tároló változó, kezdetben None.
try:
while True: # Végtelen ciklus a kliens üzeneteinek fogadására.
uzenet = kliens_socket.recv(1024).decode("utf-8") # Egy üzenet fogadása a klienstől és dekódolása UTF-8-ra.
if not uzenet: # Ha az üzenet üres, a kapcsolat bontásra kerül.
break
if uzenet.startswith("ID:"): # Ha az üzenet a kliens azonosítóját tartalmazza.
kliens_azonosito = uzenet.split(":", 1)[1] # Az azonosító kinyerése az üzenetből.
kliensek[kliens_azonosito] = kliens_socket # Az azonosító és a socket mentése a kliensek szótárba.
print(f"Új kliens hozzáadva: {kliens_cim[0]} - Azonosító: {kliens_azonosito}") # Új kliens hozzáadásának naplózása.
kliens_socket.send(f"Üdvözlünk, {kliens_azonosito}!\n".encode("utf-8")) # Üdvözlő üzenet küldése a kliensnek.
felhasznalo_lista_kuldes() # A felhasználók listájának frissítése és elküldése minden kliensnek.
elif uzenet.startswith("SEND:"): # Ha az üzenet egy másik kliensnek szól.
_, cel_azonosito, uzenet_szoveg = uzenet.split(":", 2) # Az üzenetből a cél azonosító és az üzenet szövege.
if cel_azonosito in kliensek: # Ha a célzott kliens azonosító létezik.
kliensek[cel_azonosito].send(f"MSG:{kliens_azonosito}:{uzenet_szoveg}\n".encode("utf-8")) # Az üzenet továbbítása a címzett kliensnek.
print(f"Feladó: {kliens_azonosito}, fogadó: {cel_azonosito}, üzenet: {uzenet_szoveg}") # Naplózás az üzenet továbbításáról.
else:
kliens_socket.send("HIBA:Célzott azonosító nem található!\n".encode("utf-8")) # Hibaüzenet, ha a címzett nincs csatlakozva.
elif uzenet.startswith("ALL:"): # Ha az üzenet minden kliensnek szól.
uzenet_szoveg = uzenet.split(":", 1)[1] # Az üzenet szövegének kinyerése.
for masik_azonosito, masik_socket in kliensek.items(): # Minden csatlakozott kliens iterációja.
if masik_azonosito != kliens_azonosito: # Az üzenetet nem küldjük vissza a küldőnek.
masik_socket.send(f"MSG:{kliens_azonosito} (ALL):{uzenet_szoveg}\n".encode("utf-8")) # Az üzenet továbbítása a címzetteknek.
print(f"Feladó: {kliens_azonosito}, üzenet mindenkinek: {uzenet_szoveg}") # Naplózás a broadcast üzenetről.
except Exception as hiba: # Hibakezelés.
print(f"Hiba: {hiba}") # A hiba kiírása a naplózásban.
finally:
if kliens_azonosito: # Ha van azonosító, a kliens törlése a szótárból.
kliensek.pop(kliens_azonosito, None) # Az azonosító és a socket eltávolítása.
felhasznalo_lista_kuldes() # A felhasználók listájának frissítése.
print(f"Kliens bontva: {kliens_cim}") # Kapcsolatbontás naplózása.
kliens_socket.close() # A kliens socketjének bezárása.
def felhasznalo_lista_kuldes():
"""
Aktív felhasználók listájának kiküldése minden csatlakozott kliensnek.
A lista tartalmazza az azonosítókat, vesszővel elválasztva.
"""
felhasznalo_lista = list(kliensek.keys()) # Az aktív felhasználók listájának kinyerése.
for kliens_socket in kliensek.values(): # Az összes csatlakozott kliens socketjén iterálás.
try:
kliens_socket.send(f"USERS:{','.join(felhasznalo_lista)}\n".encode("utf-8")) # Az aktív felhasználók listájának elküldése.
except Exception as hiba: # Hibakezelés, ha a lista küldése sikertelen.
print(f"Hiba a felhasználók listájának küldésekor: {hiba}") # A hiba naplózása.
def main():
"""
A szerver fő függvénye, amely inicializálja és elindítja a szervert.
Fogadja a kliens kapcsolatokat és minden kapcsolatot külön szálon kezel.
"""
szerver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP socket létrehozása.
szerver.bind((SZERVER_IP, SZERVER_PORT)) # A socket kötése a megadott IP-címhez és porthoz.
szerver.listen(5) # A szerver hallgatózik, legfeljebb 5 várakozó kapcsolattal.
print(f"Szerver fut: {SZERVER_IP}:{SZERVER_PORT}") # A szerver elindulásának naplózása.
while True: # Végtelen ciklus a kliens kapcsolatok elfogadására.
kliens_socket, kliens_cim = szerver.accept() # Egy új kliens kapcsolat elfogadása.
print(f"Új kapcsolat: {kliens_cim}") # Az új kapcsolat naplózása.
szal = threading.Thread(target=kezeles, args=(kliens_socket, kliens_cim)) # Új szál létrehozása a kliens kezelésére.
szal.start() # A szál elindítása.
if __name__ == "__main__":
main() # A szerver indítása, ha a fájl közvetlenül fut.