2013-12-21 136 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