Python:使用简单的聊天服务器/客户端进行2人游戏

时间:2014-07-08 02:24:20

标签: python sockets

我写了一个蟒蛇棋游戏,我想在两台不同的电脑上让两个人玩。在不使用外部库的情况下,我首先想到的是尝试为简单的聊天服务器/客户端调整代码,以允许游戏向两个用户传达移动。根据我的研究,似乎以下代码非常标准:

# 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

1 个答案:

答案 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循环