使用Python套接字的石头剪刀游戏

2024-10-01 01:44:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python写一个非常简单的石头布剪刀游戏。我想有1个服务器和2个客户端。连接到服务器后,服务器应向每个客户端发送一条消息以供选择(r/p/s)。在这之后,每个客户机都应该发送他们的选择,然后服务器决定胜出者,然后通知客户胜利者。在

到目前为止,我得到的是:

这是服务器.py在

import socket
from threading import Thread

class ClientThread(Thread):
    def __init__(self, ip, port):
        Thread.__init__(self)
        self.ip = ip
        self.port = port
        print("[+] New server socket thread started for " + ip + ":" + str(port))

    def run(self):
        while True:
            data = conn.recv(1024).decode()
            print("Server received data:", data)
            MESSAGE = input("Server response: ")
            if MESSAGE == 'exit':
                break
            conn.send(MESSAGE.encode())

TCP_IP = '0.0.0.0'
TCP_PORT = 2004
BUFFER_SIZE = 1024

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpServer.bind((TCP_IP, TCP_PORT))
threads = []

while True:
    tcpServer.listen(4)
    print("Multithreaded Python server : Waiting for connections from TCP clients...")
    (conn, (ip, port)) = tcpServer.accept()
    newthread = ClientThread(ip, port)
    newthread.start()
    threads.append(newthread)

for t in threads:
    t.join()

这是客户机.py公司名称:

^{pr2}$

这是客户端b.py公司名称:

import socket

host = socket.gethostname()
port = 2004
BUFFER_SIZE = 1024
MESSAGE = input("tcpClientB:")

tcpClientB = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpClientB.connect((host, port))

while MESSAGE != 'exit':
    tcpClientB.send(MESSAGE.encode())
    data = tcpClientB.recv(BUFFER_SIZE).decode()
    print(" ClientB received data:", data)
    MESSAGE = input("tcpClientB:")

tcpClientB.close()

然而,在这段代码中,我只能向服务器发送消息,它可以响应。不幸的是,在这种情况下,我不知道如何向特定的客户端发送消息。(我需要给胜利者和失败者发送不同的信息)。在


Tags: pyimportselfip服务器消息客户端message
1条回答
网友
1楼 · 发布于 2024-10-01 01:44:39

首先,这不是一个简单的练习,它需要对线程如何工作以及如何在Python中使用它们有一个良好的理解。你现在似乎缺少的是一种协调来自2个客户机的通信的方法,并跟踪每个客户机所玩的游戏,这样你就可以决定哪个客户机赢了。在

当前的情况是,当tcpClientA.connect((host, port))在客户端A上运行时,(conn, (ip, port)) = tcpServer.accept()在服务器中被解除阻塞。这将创建ClientThread类的一个新实例,新线程开始监听客户机a在连接上发送的数据。当客户端B运行时,也会发生同样的情况,现在有2个线程在运行并侦听数据,但无法知道哪个线程在播放什么。在

我建议引入一个新的类来代表游戏本身。该类将从两个客户端获取消息,并相应地对每个消息进行响应。你还需要一种等待两个客户轮到他们的方式,然后才能决定谁赢,给每个客户发送什么。在

一种方法是使用Barrier objects。在

相关问题 更多 >