Java UDP 创建与跟踪器的连接请求永远不会返回响应

问题描述 投票:0回答:1

我正在实现一个从 .torrent 文件下载 torrent 的应用程序,作为使用 GraalVM 的 CLI 工具和本机应用程序的研究项目。我在尝试创建与 UDP 跟踪器的连接时遇到问题。我能够发送连接请求,但接收请求一直在变化。我到处研究,但我无法

t find why it
不起作用。 这是负责连接 UDP 跟踪器的 java 类:

package org.jtorr.service.impl;

import com.dampcake.bencode.Bencode;
import org.jtorr.component.generator.TransactionIdGenerator;
import org.jtorr.exception.TrackerServiceException;
import org.jtorr.model.bencode.BencodeData;
import org.jtorr.model.bencode.TrackerResponse;
import org.jtorr.model.tracker.TrackerUDPConnect;
import org.jtorr.service.TrackerService;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;

public class UdpTrackerServiceImpl implements TrackerService {
    private static final int DEFAULT_PORT = 6969;

    private final DatagramSocket datagramSocket;
    private final TransactionIdGenerator transactionIdGenerator;
    private final Bencode bencode;

    public UdpTrackerServiceImpl() {
        try {
            datagramSocket = new DatagramSocket(DEFAULT_PORT);
            transactionIdGenerator = new TransactionIdGenerator();
            bencode = new Bencode();
        } catch (SocketException e) {
            throw new TrackerServiceException("Error instantiating service: " + e.getMessage(), e);
        }
    }

    @Override
    public TrackerResponse getPeersInfoFromTracker(BencodeData bencodeData, String peerId, String infoHash) {
        var uri = announceToURI(bencodeData.announce());
        createConnectionRequest(uri);

        return null;
    }

    private URI announceToURI(String announce) {
        try {
            return new URI(announce);
        } catch (URISyntaxException e) {
            throw new TrackerServiceException("Error creating URI from announce: " + e.getMessage(), e);
        }
    }

    private void createConnectionRequest(URI uri) {
        try {
            var transactionId = transactionIdGenerator.generate();
            var buff = TrackerUDPConnect.builder()
                    .transactionId(transactionId)
                    .build()
                    .getBytes();

            var address = InetAddress.getByName(uri.getHost());
            var packet = new DatagramPacket(buff, buff.length, address, uri.getPort());
            datagramSocket.send(packet);

            packet = new DatagramPacket(buff, buff.length);
            datagramSocket.receive(packet);

            var response = new String(packet.getData(), 0, packet.getLength());
            System.out.println(response);
        } catch (UnknownHostException e) {
            throw new TrackerServiceException("Error connecting to host: " + e.getMessage(), e);
        } catch (IOException e) {
            throw new TrackerServiceException("Error creating connection with tracker: " + e.getMessage(), e);
        }
    }
}

ve tough that maybe ubuntu was blocking the UDP connection somehow. I
已尝试通过执行以下操作来释放端口:
sudo ufw allow 38438/udp

但这对问题没有任何影响。

我检查过是否是防火墙问题,但 ubuntu 中防火墙被禁用。

java udp torrent
1个回答
0
投票

这些是一些通用的观察和故障排除方法,您可以尝试并让我了解更多信息,例如 GraalVM 版本、环境、错误消息等。

主要观察结果和潜在问题:

  • 无限
    receive
    呼叫
    datagramSocket.receive(packet)
    呼叫无限期阻塞,表明从跟踪器接收响应时出现问题。
  • Ubuntu 防火墙:虽然您已经检查了防火墙,但值得再次检查 sudo ufw 状态并确保没有其他软件防火墙干扰。
  1. 端口号:验证您使用的跟踪器端口号是否正确。有些跟踪器使用默认端口以外的端口
    6969
  2. 跟踪器可用性:使用已知工作的跟踪器进行测试,以隔离您正在使用的特定跟踪器的潜在问题。
  • 网络连接:确保您的互联网连接稳定且不会阻止 UDP 流量。
  • GraalVM 注意事项:了解 GraalVM 和网络的任何已知限制或约束,尤其是 UDP 通信。

故障排除步骤:

1。添加超时

  • 为接收呼叫设置超时,以防止无限期阻塞:
datagramSocket.setSoTimeout(5000); // Timeout after 5 seconds
  • 手柄
    SocketTimeoutException
    以指示超时。

2。检查跟踪器响应:

  • 使用数据包分析器(例如 Wireshark)捕获网络流量并验证跟踪器是否正在发送响应。

3.验证端口和地址:

  • 仔细检查跟踪器的端口号和 IP 地址的准确性。

4。使用不同的跟踪器进行测试:

  • 使用已知正常工作的跟踪器来查看问题是否仍然存在。

5。回顾 GraalVM 网络:

  • 请参阅 GraalVM 文档以了解任何特定的网络注意事项或限制。

6。调试和日志:

  • 添加日志记录以跟踪数据包发送/接收并识别潜在错误。
  • 使用调试器单步调试代码并检查变量。

其他注意事项:

  • UDP 数据包大小: 确保 UDP 数据包大小在您的网络允许的限制内。
  • GraalVM 本机映像配置: 检查 GraalVM 本机映像配置以了解任何与网络相关的选项。
© www.soinside.com 2019 - 2024. All rights reserved.