Python:通知系统?

时间:2013-12-21 17:05:09

标签: python sockets networking

我正在使用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()

这是客户:

import socket
import sys,os

name=raw_input("Enter name: ")
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.1.80', 10000)
print >>sys.stderr, 'connecting to %s port %s' % server_address
while True:
    message=raw_input('Message: ')
    try:
        os.system('cls')
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(server_address)
        if message is not '':
            sock.sendall(name+": "+message)
        else:
            sock.sendall('EMPTY')
        if message=='quit':
            break
        x=sock.recv(999)
        print x
    except:
        break
sock.close()

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您需要同时进行两项操作(客户端脚本需要从用户读取输入并从服务器读取新消息),那么您需要使用线程(一个用于读取用户输入的线程,一个用于从服务器读取消息的线程),或futures(从python3.2开始)。

答案 1 :(得分:1)

以下是在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