Python:为两人游戏使用简单的聊天服务器/客户端

1 投票
1 回答
2891 浏览
提问于 2025-04-18 12:26

我写了一个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上的问题:

如何在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循环。

撰写回答