Socket: wysyłanie i odbieranie danych w tym samym czasie
Jedno gniazdo (socket) może wysyłać i odbierać w tym samym czasie ale jeden wątek musi tylko obierać dane a drugi tylko wysyłać dane.
W ten sposób send()
nie musi czekać na zakończenie recv()
a recv()
nie musi czekać na zakończenie send()
więc nie blokują się wzajenie.
Bez użycia wątków było by to trudniejsze.
client.py
import socket
import threading
import sys
# --- functions ---
def recv_msg():
while True:
recv_msg = conn.recv(1024)
if not recv_msg:
sys.exit(0)
recv_msg = recv_msg.decode()
print(recv_msg)
def send_msg():
while True:
send_msg = input(str("Enter message: "))
send_msg = send_msg.encode()
conn.send(send_msg)
print("message sent")
# --- main ---
host = socket.gethostname()
port = 8080
s = socket.socket()
s.bind((host, port))
s.listen(1)
print("Waiting for connections")
conn, addr = s.accept()
print("Client has connected")
conn.send("Welcome to the server".encode())
# thread has to start before other loop
t = threading.Thread(target=recv_msg)
t.start()
send_msg()
server.py
import socket
import threading
import sys
# --- functions ---
def recv_msg():
while True:
recv_msg = conn.recv(1024)
if not recv_msg:
sys.exit(0)
recv_msg = recv_msg.decode()
print(recv_msg)
def send_msg():
while True:
send_msg = input(str("Enter message: "))
send_msg = send_msg.encode()
conn.send(send_msg)
print("message sent")
# --- main ---
host = socket.gethostname()
port = 8080
s = socket.socket()
s.bind((host, port))
s.listen(1)
print("Waiting for connections")
conn, addr = s.accept()
print("Client has connected")
conn.send("Welcome to the server".encode())
# thread has to start before other loop
t = threading.Thread(target=recv_msg)
t.start()
send_msg()
If you like it
Buy a Coffee
Buy a Coffee