Python:通知系统?

2024-04-20 05:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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}$

谢谢!在


Tags: import服务器消息dataserveraddress计算机sys
2条回答

如果需要同时执行两个操作(客户机脚本需要从用户读取输入,需要从服务器读取新消息),则需要使用线程(一个线程用于读取用户输入,另一个线程用于从服务器读取消息),或者使用futures(从python3.2开始)。在

下面是在python中播放音频的问题:Play audio with Python

至于你的客户机,为什么每次都要重新连接到服务器?不管怎样,如果我正确地理解了这个问题,那么您就阻塞了用户输入,但也希望处理来自服务器的消息。在

在不让线程复杂化的情况下,我建议使用一个重复出现的信号,我相信它可以处理这个问题。有一个函数调用setitimer(),它会中断您正在做的事情,并每隔一段时间调用一个函数,然后返回到原来的位置(用户输入)。在计时器功能中,检查服务器消息,打印接收到的消息,播放声音并返回用户输入。这里有一个setitimer()示例enter link description here。在

用户键入的内容可能有点难看,因此您可能需要重新打印他们当前键入的内容,但尚未发送出去(使用raw_input()以外的其他内容)。在

对于稍微复杂一点的选项,它可以帮助您使用一个函数调用select(),它可以在监听套接字输入和用户输入时阻塞。然后你只需区分哪个是哪个,并将其保持在一个循环中。在

while True:
    # select on server socket and user input (blocks for either one)

    # if here, either a message has been received or the user typed something

    # if a message from server
        ...
        playSound()
    # else 
        # send to server

相关问题 更多 >