基于TCP Socket的问答游戏问题:如何实现答题后发送下一题
TCP问答游戏无法发送第二题的问题修复
核心问题分析
- 服务器端:
- 主循环重复执行
accept(),处理完一次问答后就断开连接等待新请求,而非保持当前连接继续后续交互 - 未接收客户端提交的答案,也没有对错判断逻辑,
correct变量从未更新,无法触发后续题目发送 - 发送题目后未等待客户端回复,流程直接中断
- 主循环重复执行
- 客户端:
- 外层循环重复调用
connect(),每次问答都创建新连接,破坏了TCP长连接的交互逻辑 correct变量无更新逻辑,无法终止循环
- 外层循环重复调用
修改后的服务器代码
from socket import * from random import choice serverPort = 13000 serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind(('', serverPort)) serverSocket.listen(1) print('The server is ready to receive') fullquiz = [] questions = [] answers = [] # 读取并处理题库文件,清理换行符和空白字符 with open("quiz.txt") as data_file: for line in data_file: data = [item.strip() for item in line.split(',')] fullquiz += data questions = fullquiz[0::2] # 提取所有问题 answers = fullquiz[1::2] # 提取对应答案 # 外层循环等待新客户端连接 while True: connectionSocket, addr = serverSocket.accept() print(f"Connected with {addr}") correct = 0 # 每个客户端的答题计数单独初始化 # 内层循环处理当前客户端的多轮问答 while correct < 3: # 随机选择题目(如需避免重复可添加已选题目过滤逻辑) question_idx = choice(range(len(questions))) selected_question = questions[question_idx] correct_answer = answers[question_idx] # 发送题目给客户端 connectionSocket.send(selected_question.encode()) # 接收客户端的答案 client_answer = connectionSocket.recv(1024).decode().strip() # 判断答案是否正确并发送反馈 if client_answer.lower() == correct_answer.lower(): correct += 1 connectionSocket.send("正确!".encode()) else: connectionSocket.send(f"错误,正确答案是:{correct_answer}".encode()) print(f"当前正确数:{correct}") # 答题结束,发送结束消息并关闭连接 connectionSocket.send("答题结束!".encode()) connectionSocket.close() print(f"与 {addr} 的连接已关闭")
修改后的客户端代码
from socket import * serverName = '127.0.0.1' serverPort = 13000 correct = 0 # 只建立一次TCP连接 clientSocket = socket(AF_INET, SOCK_STREAM) clientSocket.connect((serverName, serverPort)) print("已连接到服务器") while correct < 3: # 接收服务器发送的内容 recv_data = clientSocket.recv(1024).decode() # 检查是否是结束消息 if recv_data == "答题结束!": print(recv_data) break print('Question:', recv_data) answer = input('请输入你的答案: ') clientSocket.send(answer.encode()) # 接收服务器的对错反馈 feedback = clientSocket.recv(1024).decode() print(feedback) # 更新正确答题数 if "正确" in feedback: correct += 1 # 关闭连接 clientSocket.close()
额外说明
- 题库文件
quiz.txt每行格式需为问题,答案,例如:中国的首都是哪里?,北京 - 服务器现在会为每个客户端单独维护答题计数,若需支持多客户端同时连接,可扩展多线程/多进程逻辑
- 客户端保持一次连接完成3轮答题,结束后自动断开
内容的提问来源于stack exchange,提问作者Alex Crawford
相关产品推荐
相关产品推荐

