我正在使用socket在本地网络上运行的聊天服务器上工作,然后我有一个客户端程序运行在我家所有的计算机上,这个程序允许所有的客户机相互交谈。在
问题是,您必须按enter手动更新聊天日志。在
我希望它工作的方式,也许是每隔几秒钟检查一条新消息,如果有新消息,播放一个声音。如果有人知道我该怎么做吗,我会尽力自己解决,就像我在这个项目中所做的那样,但是任何帮助都是非常感谢的。在
这是服务器:
import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.1.80', 10000)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)
sock.listen(1)
print 'Waiting for user...'
convo='Welcome!'
while True:
# Find connections
connection, client_address = sock.accept()
try:
data = connection.recv(999)
if data=='EMPTY':
pass
else:
print data
convo=convo+'\n'+data
connection.sendall(convo)
except:
connection.close()
客户如下:
^{pr2}$谢谢!在
如果需要同时执行两个操作(客户机脚本需要从用户读取输入,需要从服务器读取新消息),则需要使用线程(一个线程用于读取用户输入,另一个线程用于从服务器读取消息),或者使用futures(从python3.2开始)。在
下面是在python中播放音频的问题:Play audio with Python
至于你的客户机,为什么每次都要重新连接到服务器?不管怎样,如果我正确地理解了这个问题,那么您就阻塞了用户输入,但也希望处理来自服务器的消息。在
在不让线程复杂化的情况下,我建议使用一个重复出现的信号,我相信它可以处理这个问题。有一个函数调用
setitimer()
,它会中断您正在做的事情,并每隔一段时间调用一个函数,然后返回到原来的位置(用户输入)。在计时器功能中,检查服务器消息,打印接收到的消息,播放声音并返回用户输入。这里有一个setitimer()示例enter link description here。在用户键入的内容可能有点难看,因此您可能需要重新打印他们当前键入的内容,但尚未发送出去(使用raw_input()以外的其他内容)。在
对于稍微复杂一点的选项,它可以帮助您使用一个函数调用select(),它可以在监听套接字输入和用户输入时阻塞。然后你只需区分哪个是哪个,并将其保持在一个循环中。在
相关问题 更多 >
编程相关推荐