我想用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()
然而,在这段代码中,我只能向服务器发送消息,它可以响应。不幸的是,在这种情况下,我不知道如何向特定的客户端发送消息。(我需要给胜利者和失败者发送不同的信息)。在
首先,这不是一个简单的练习,它需要对线程如何工作以及如何在Python中使用它们有一个良好的理解。你现在似乎缺少的是一种协调来自2个客户机的通信的方法,并跟踪每个客户机所玩的游戏,这样你就可以决定哪个客户机赢了。在
当前的情况是,当
tcpClientA.connect((host, port))
在客户端A上运行时,(conn, (ip, port)) = tcpServer.accept()
在服务器中被解除阻塞。这将创建ClientThread
类的一个新实例,新线程开始监听客户机a在连接上发送的数据。当客户端B运行时,也会发生同样的情况,现在有2个线程在运行并侦听数据,但无法知道哪个线程在播放什么。在我建议引入一个新的类来代表游戏本身。该类将从两个客户端获取消息,并相应地对每个消息进行响应。你还需要一种等待两个客户轮到他们的方式,然后才能决定谁赢,给每个客户发送什么。在
一种方法是使用Barrier objects。在
相关问题 更多 >
编程相关推荐