You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TCP Socket的问答游戏问题:如何实现答题后发送下一题

TCP问答游戏无法发送第二题的问题修复

核心问题分析

  1. 服务器端:
    • 主循环重复执行accept(),处理完一次问答后就断开连接等待新请求,而非保持当前连接继续后续交互
    • 未接收客户端提交的答案,也没有对错判断逻辑,correct变量从未更新,无法触发后续题目发送
    • 发送题目后未等待客户端回复,流程直接中断
  2. 客户端:
    • 外层循环重复调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:15:51