我写了一个蟒蛇棋游戏,我想在两台不同的电脑上让两个人玩。在不使用外部库的情况下,我首先想到的是尝试为简单的聊天服务器/客户端调整代码,以允许游戏向两个用户传达移动。根据我的研究,似乎以下代码非常标准:
# 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()
我的想法是,一个玩家(邀请其他玩家加入游戏的主持人)启动游戏和服务器。然后客户端移动,将移动发送到服务器,并且更改反映在UI上。
但是,监听消息/响应的无限循环给我带来了麻烦:显然,没有其他代码可以执行。我宁愿让客户端和服务器之间的连接在后台,或者甚至更好地利用UI已经使用的无限循环来监听事件。
我的问题:是否可以使用Tkinter的mainloop
充当无限循环来侦听传入的数据和回复?或者,将服务器和客户端作为子进程运行会更好。我想我真正喜欢的是将移动的侦听/接收视为事件:当移动时,发送消息,并由客户端“处理”。
注意:这是我第一次使用套接字库 - 如果有任何答案可以尊重我对该主题的相对天真,那就太棒了。
编辑:我认为我可能需要的是asynchat,但我非常希望了解如何调整此代码。
最后的评论:gordosac的回答为搜索提供了一些很棒的想法。我最终找到了我需要的here
答案 0 :(得分:1)
在SO上看一下这个问题:
How to use threading in Python?
你会为客户做这样的事情:
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循环