(Python)如何在不刷新的情况下实时接收消息?
我跟随了一个名叫Drapsv的YouTuber的教程。本教程是用Python 2.7编写的,使用UDP进行网络聊天。我将其转换为Python3并使所有内容都正常工作。但是,线程设置的方式是,我必须发送一条消息(或按enter键,这是一条空白消息)来刷新和接收来自其他客户端的任何消息。这是您可能需要的视频: 这是我的服务器代码:(Python)如何在不刷新的情况下实时接收消息?,python,server,udp,client,Python,Server,Udp,Client,我跟随了一个名叫Drapsv的YouTuber的教程。本教程是用Python 2.7编写的,使用UDP进行网络聊天。我将其转换为Python3并使所有内容都正常工作。但是,线程设置的方式是,我必须发送一条消息(或按enter键,这是一条空白消息)来刷新和接收来自其他客户端的任何消息。这是您可能需要的视频: 这是我的服务器代码: from socket import * import time address = input("IP Address: ") port = input("Port
from socket import *
import time
address = input("IP Address: ")
port = input("Port: ")
clients = []
serversock = socket(AF_INET, SOCK_DGRAM)
serversock.bind((address, int(port)))
serversock.setblocking(0)
quitting = False
print("Server is up and running so far.")
while not quitting:
try:
data, addr = serversock.recvfrom(1024)
if "Quit" in str(data):
quitting = True
if addr not in clients:
clients.append(addr)
print(time.ctime(time.time()) + str(addr) + ": :" + str(data.decode()))
for client in clients:
serversock.sendto(data, client)
except:
pass
serversock.close()
这是我的客户代码:
from socket import *
import threading
import time
tLock = threading.Lock()
shutdown = False
def receiving(name, sock):
while not shutdown:
try:
tLock.acquire()
while True:
data, addr = sock.recvfrom(1024)
print(str(data.decode()))
except:
pass
finally:
tLock.release()
address = input("IP Address: ")
port = 0
server = address, 6090
clientsock = socket(AF_INET, SOCK_DGRAM)
clientsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
clientsock.bind((address, int(port)))
clientsock.setblocking(0)
rT = threading.Thread(target=receiving, args=("RecvThread", clientsock))
rT.start()
nick = input("How about we get you a nickname: ")
message = input(nick + "> ").encode()
while message != "q":
if message != "":
clientsock.sendto(nick.encode() + "> ".encode() + message, server)
tLock.acquire()
message = input(nick + "> ").encode()
tLock.release()
time.sleep(0.2)
shutdown = True
rT.join()
clientsock.close()
@furas善意地向我解释了我的问题:不是我的接收方法有缺陷(比如线程或函数),而是输入调用阻止了客户端接收任何东西。因此,为了解决这个问题,我或其他任何有这个问题的人需要找到一种方法,在按下某个按钮时调用输入,这样,除非您键入,否则您可以接收消息或数据
谢谢你@furas 问题是nto套接字或线程,但它阻止了所有程序。但是没有非阻塞
input()
的标准方法。您可以创建两个线程—一个仅用于从服务器接收,另一个用于发送到服务器和input()?