我正在使用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()
谢谢!
答案 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