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

环形分布式哈希表TCP通信异常:连接建立后无消息接收

问题根源与修复方案

咱们直接定位导致Peer3无法接收Peer1消息的核心问题——你的serverTCP函数中处理FIND类型消息的代码存在多处语法和逻辑错误,直接导致消息处理流程崩溃,根本走不到发送回复的步骤:

核心错误点

  1. 正则匹配参数传递完全错误
    在处理FIND消息时,你写了:

    dest = re.match('^FIND([0-9]{1,3}),([0-9]{4})','',threeinfo)
    

    re.match的正确参数顺序是pattern, string,你多传了一个空字符串,导致实际要匹配的threeinfo被当成了可选的flags参数,最终dest会是None,后续访问dest.group(1)会直接抛出AttributeError,程序崩溃。

  2. 正则表达式不匹配实际消息格式
    Peer1发送的消息是"FIND1,3456,3",包含三个字段(自身ID、文件名、目标PeerID),但你的正则只匹配了前两个字段,就算参数传对了也匹配不上。

  3. 引用未定义变量
    代码里有一行print sen,但sen这个变量从来没被定义过,这也会导致程序抛出NameError中断流程。

  4. 缺少异常处理
    你的TCP服务线程没有任何异常捕获逻辑,一旦上述错误发生,线程会直接退出,Peer3就失去了处理后续连接的能力。

修复步骤

针对上述问题,修改serverTCP中处理FIND消息的代码块,同时补充必要的异常处理:

elif re.match('^FIND',threeinfo):
    try:
        # 修正正则表达式,匹配完整的FIND消息格式:FIND<peerID>,<filename>,<targetPeerID>
        dest = re.match('^FIND([0-9]{1,3}),([0-9]{4}),([0-9]{1,3})$', threeinfo)
        if dest is not None:
            fromP = dest.group(1)
            fileP = dest.group(2)
            # 按照需求输出指定内容
            print 'peer ' + fromP + ' has the value'
            # 可选:发送回复消息给Peer1
            connectionSocket.send('ACK from peer ' + str(peer))
        else:
            print 'Invalid FIND message format'
    except Exception as e:
        print 'Error processing FIND message:', str(e)
    finally:
        # 确保连接正常关闭
        connectionSocket.close()

另外,还要补全其他潜在问题的修复:

  • 全局变量flag和important没有初始化,需要在代码开头添加flag = 0和important = '',否则程序启动就会报错。
  • 多线程操作全局变量important存在竞争风险,建议用threading.Lock()来保护对它的读写,避免消息丢失或混乱。
  • getRequestInput和sendRequestToS函数中调用clientSocketTCP.close()后,后续循环无法复用该socket,需要在每次发送前重新创建socket,或者调整逻辑避免提前关闭。

验证修复效果

修复后,当Peer1发送"FIND1,3456,3"到Peer3的TCP服务端时:

  1. Peer3的serverTCP线程会正确解析消息
  2. 输出要求的peer 1 has the value
  3. 可以正常发送回复消息(如果需要)
  4. 即使出现异常,也会被捕获,不会导致服务线程崩溃

内容的提问来源于stack exchange,提问作者Lilac Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:47