Python:为两人游戏使用简单的聊天服务器/客户端
我写了一个Python的国际象棋游戏,想让两个不同的电脑上的人可以一起玩。为了不使用外部库,我的第一个想法是试着改编一些简单的聊天服务器/客户端的代码,让游戏可以把棋步传递给两个玩家。根据我的研究,下面的代码看起来是比较标准的:
# client
from socket import *
PORT = 8000
s = socket(AF_INET, SOCK_STREAM)
s.connect(('', PORT))
while True:
msg = raw_input('>> ')
s.send(msg)
reply = s.recv(1024)
if reply:
print '<< ' + str(reply)
s.close()
#server
from socket import *
HOST = ''
PORT = 8000
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(2)
conn, address = s.accept()
while True:
print 'got a connection'
data = conn.recv(1024)
if data:
print 'we got it'
conn.sendall(data)
s.close()
我的想法是,一个玩家(也就是邀请另一个玩家的主机)来启动游戏和服务器。然后客户端进行移动,把这个移动发送给服务器,界面上就会显示出变化。
不过,上面那些监听消息/回应的无限循环让我有点困扰:显然,这样的话其他代码就无法执行了。我更希望客户端和服务器之间的连接能在后台进行,或者更好的是,利用界面已经使用的无限循环来监听事件。
我的问题:是否可以使用Tkinter的mainloop
作为一个无限循环来监听传入的数据和回复?或者,运行服务器和客户端作为子进程会更好?我想我真正想要的是把监听和接收棋步当作事件来处理:当有棋步被移动时,发送一条消息,然后由客户端来“处理”这条消息。
注意:这是我第一次使用socket库——如果能有人在回答时考虑到我对这个话题的相对无知,那就太好了。
编辑:我觉得我可能需要asynchat,但我非常希望能理解这段代码该如何改编。
最后的备注:gordosac的回答提供了一些很好的搜索思路。我最终找到了我需要的东西,在这里
1 个回答
1
看看这个在StackOverflow上的问题:
对于客户端,你可以这样做:
import threading
import os
import time
# this function meant to be started in a separate thread
get_raw_input_and_send():
#put while loop here
if __name__ == "__main__":
t = threading.Thread(target=get_raw_input_and_send)
t.daemon = True
t.start()
while True:
if not t.isAlive():
os.sys.exit(-1)
time.sleep(5)
然后在服务器端,你可以做类似的事情,只不过要用到服务器代码中的while循环。