2013-12-21 138 views
1

我正在使用套接字在我的本地网络上运行的聊天服务器上工作,然后我的客户端程序在我家的所有计算机上运行,​​并且此程序允许所有客户端相互通话。Python:通知系统?

问题是,您必须通过按回车手动更新聊天记录。

我希望它的工作方式,也许,是检查新邮件每隔几秒钟,如果有一个新的,播放声音。有没有人知道我可以做到这一点,我会尝试自己解决,因为我已经完成了大部分这个项目,但任何帮助表示赞赏。

这里是服务器:

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() 

谢谢!

回答

1

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

1

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

至于你的客户,你为什么要重新连接到你的服务器每一次?无论如何,如果我正确地理解了这个问题,你会阻止用户输入,但也想处理来自服务器的消息。

不带螺纹越来越复杂了,我会用重复的信号,我相信会处理这个建议。有一个函数调用setitimer(),这将打破你正在做的事情,每隔一段时间调用一次函数,然后返回到你所在的位置(用户输入)。在你的计时器功能,检查服务器的邮件,打印任何收到的,发挥你的声音并返回到用户输入。有一个setitimer()示例enter link description here

可能是有点丑与用户打字,所以你可能需要重新打印什么,他们目前正在打字,但尚未发送出去(使用的raw_input比其他的东西())。

对于稍微复杂的选项,它可以帮助你有一个函数调用选择(),而监听套接字输入和用户输入这可以阻止。然后,你只要区分哪个是哪一个,并将它全部保存在一个循环中。

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