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.