Как получать сообщения без нажатия Enter в программировании сокетов - PullRequest
0 голосов
/ 11 июня 2019

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

#my client side code
import socket 
import sys

client_sock = socket.socket() 
port = int(sys.argv[1])
client_sock.connect(('127.0.0.1', port))
print("Connected to server. start sending messages") 
while True:
    sending_message = input('> ')
    if sending_message:
        client_sock.send(sending_message.encode())
    receiving_message = client_sock.recv(1024)
    if  receiving_message:
        print(receiving_message.decode()) 

1 Ответ

0 голосов
/ 11 июня 2019

input приостанавливает вашу программу. Таким образом, либо вы не можете использовать input вслепую, либо вы должны использовать потоки. Использовать потоки проще, чем альтернативу (используйте select, чтобы выяснить, что делать дальше). Есть одна нить для ввода и отправки, одна нить для получения и печати. ​​

Вот тривиальное переписывание вашего кода:

import threading
import socket 
import sys

client_sock = socket.socket() 
port = int(sys.argv[1])
client_sock.connect(('127.0.0.1', port))
print("Connected to server. start sending messages")

def sender():
    while True:
        sending_message = input('> ')
        if sending_message:
            client_sock.send(sending_message.encode())

def receiver():
    while True:
        receiving_message = client_sock.recv(1024)
        if  receiving_message:
            print(receiving_message.decode()) 

sender_thread = threading.Thread(target=sender)
receiver_thread = threading.Thread(target=receiver)

sender_thread.start()
receiver_thread.start()

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