• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python, socket, programownie serwera

VPS Starter Arubacloud
0 głosów
223 wizyt
pytanie zadane 27 października 2020 w Python przez WojtaZio23 Użytkownik (660 p.)
serwer.py:

import socket
import threading
import selectors

sel = selectors.DefaultSelector()
#stworzenie socketu
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_adress = ('localhost', 4683)
#utworzenie adresu serwer na naszej maszynie z dowolnie  
print("utworzono serwer %s na porcie %s"  % server_adress)  
sock.bind(server_adress)
sock.listen()
print("nasluchiwanie na", server_adress)
sock.setblocking(False)

sel.register(sock, selectors.EVENT_READ, data=None)

def accept_wrapper(sock):
    connection, addres = sock.accept()
    print("Zaakceptowano polaczenie z ", addres)
    connection.setblocking(False)
    data = types.SimpleNamespace(addr, inb=b'', outb=b'')
    events = selectors.EVENT_READ | selectors.EVENT_WRITE
    sel.register(conn, events, data=data)

def service_connection(key, mask):
    sock = key.fileobj
    data = key.data
    if mask & selectors.EVENT_READ:
        recv_data = sock.recv(1024)
        if rev_data:
            data.outb += recv_data
        else:
            print("Zamykanie polaczenia z", data.addr)
            sel.unregister(sock)
            sock.close()
    if mask & selctors.EVENT_WRITE:
        if data.outb:
            print('odbijanie', repr(data.outb), 'do', data.addr)
            sent = sock.send(data.outb)
            data.outb = data.outb[sent: ]


while True:
    events = sel.select(timeout=None)
    for key, mask in events:
        if key.data is None:
            accept_wrapper(key.fileobj) 
        else:
            service_connection(key, mask) 
client.py:

import socket 
import selectors

mess = [b'widaomosc nr 1 od klienta', b'wiadomosc nr 2 od klienta']

def start_conn(host, port, ilosc_pol):
	server_adress = ('localhost', port)
	for i in range(0, ilosc_pol):
		id_pol = i + 1
		print('laczenie', id_pol, 'z', server_adress)
		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		sock.setblocking(False)
		sock.connect_ex(server_adress)
		events = selectors.EVENT_READ | selectors.EVENT_READ
		data = types.SimpleNamespace(id_pol=id_pol, msg_total=sum(len(m) for m in messages), recv_total=0, messages=list(messages), outb=b'')
		sel.register(sock, events, data=data)

def service_conn(key, mask):
	sock = key.fileobj
	data = key.data
	if mask & selectors.EVENT_READ:
		recv_data = sock.recv(1024)
		if recv_data:
			print('odebrano', repr(recv_data), 'od', data.id_pol)
			data.recv_total += len(recv_data)
		if not recv_data or data.recv_total == data.msg_total:
			print('rozlaczanie z', data.id_pol)
			sel.unregister(sock)
			sock.close()
		if mask & selectors.EVENT_WRITE:
			if not data.outb and data.messages:
				data.outb = data.messages.pop(0)
			if data.outb:
				print('wysylanie', repr(data.outb), 'do', data.id_pol)
				sent = sock.send(data.outb)
				data.outb = data.outb[sent: ]

Mozolnie, bo mozolnie, ale próbuję się nauczyć programować swój własny serwer. Powyższy kod napisałem/przepisałem przy pomocy poradnika z tej strony: https://realpython.com/python-sockets/#multi-connection-server ,ale mój serwer zamiast działać tak jak na tamtym przykładzie po prostu kończy działanie w momencie kiedy uruchamiam klienta. Będę bardzo wdzięczny za pomoc w rozwiązaniu mojego problemu.

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 317 wizyt
pytanie zadane 28 października 2020 w Python przez WojtaZio23 Użytkownik (660 p.)
0 głosów
0 odpowiedzi 163 wizyt
+1 głos
1 odpowiedź 374 wizyt
pytanie zadane 4 września 2018 w C i C++ przez lolk45 Gaduła (3,210 p.)

93,015 zapytań

141,978 odpowiedzi

321,271 komentarzy

62,358 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...