Как отправлять и получать сообщения одновременно python сокетов - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь изучить программирование сокетов и в настоящее время имею следующий код server и client, однако проблема в том, что сервер и / или клиент не могут отправлять и получать сообщения одновременно, они по очереди отправляю и получаю сообщения.

Я посмотрел на приведенный ниже пример, но, похоже, ответ не решил проблему, или я неправильно его понимаю.

Python Сокет - отправлять и получать сообщения одновременно

сервер

import socket
import threading
s = socket.socket()
host = socket.gethostname()
port = 8080
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())

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():
    send_msg = input(str("Enter message: "))
    send_msg = send_msg.encode()
    conn.send(send_msg)
    print("message sent")

while True:
    send_msg()

t = threading.Thread(target=recv_msg)
t.start()

клиент

import socket
import threading
s = socket.socket()
host = socket.gethostname()
port = 8080
s.connect((host, port))
print("Connected to the server")
message = s.recv(1024)
message = message.decode()
print(message)

def recv_msg():
    while True:
        recv_msg = s.recv(1024)
        if not recv_msg:
            sys.exit(0)
        recv_msg = recv_msg.decode()
        print(recv_msg)

def send_msg():
    send_msg = input(str("Enter message: "))
    send_msg = send_msg.encode()
    s.send(send_msg)
    print("Message sent")

while True:
    send_msg()

t = threading.Thread(target=recv_msg)
t.start()

Я в конечном итоге пытаюсь создать приложение для чата (с kivy), которое напоминает Whatsapp / Imessage et c, я не нашел учебник о том, как это сделать (все, что я видел, о создании чат), так что если кто-то видел тот, который будет оценен.

1 Ответ

0 голосов
/ 25 февраля 2020

В клиенте и на сервере вы должны запустить потоки перед запуском циклов while True: send_msg()

t = threading.Thread(target=recv_msg)
t.start()

while True:
    send_msg()

РЕДАКТИРОВАТЬ:

сервер. 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()

client.py

import socket
import threading
import sys

# --- functions ---

def recv_msg():
    while True:
        recv_msg = s.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()
        s.send(send_msg)
        print("Message sent")

# --- main ---

host = socket.gethostname()
port = 8080

s = socket.socket()
s.connect((host, port))

print("Connected to the server")

message = s.recv(1024)
message = message.decode()
print(message)

# thread has to start before other loop
t = threading.Thread(target=recv_msg)
t.start()

send_msg()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...