0

我正在尝试使用 ttorrent 库为 android 创建 torrent 应用程序。我有一些问题。

05-29 23:07:23.388: E/AndroidRuntime(3681): 致命异常: bt-announce(..393337)

05-29 23:07:23.388: E/AndroidRuntime(3681): java.lang.NullPointerException

05-29 23:07:23.388: E/AndroidRuntime(3681): at com.turn.ttorrent.common.protocol.http.HTTPAnnounceResponseMessage.parse(HTTPAnnounceResponseMessage.java:105)

05-29 23:07:23.388: E/AndroidRuntime(3681): at com.turn.ttorrent.common.protocol.http.HTTPTrackerMessage.parse(HTTPTrackerMessage.java:51)

05-29 23:07:23.388: E/AndroidRuntime(3681): at com.turn.ttorrent.client.announce.HTTPTrackerClient.announce(HTTPTrackerClient.java:124)

05-29 23:07:23.388: E/AndroidRuntime(3681): at com.turn.ttorrent.client.announce.Announce.run(Announce.java:224)

05-29 23:07:23.388: E/AndroidRuntime(3681): 在 java.lang.Thread.run(Thread.java:856)

public static HTTPAnnounceResponseMessage parse(ByteBuffer data)
    throws IOException, MessageValidationException {
    BEValue decoded = BDecoder.bdecode(data);
    if (decoded == null) {
        throw new MessageValidationException(
            "Could not decode tracker message (not B-encoded?)!");
    }

    Map<String, BEValue> params = decoded.getMap();

    try {
        List<Peer> peers;

        try {
            // First attempt to decode a compact response, since we asked
            // for it.
            peers = toPeerList(params.get("peers").getBytes());
        } catch (InvalidBEncodingException ibee) {
            // Fall back to peer list, non-compact response, in case the
            // tracker did not support compact responses.
            peers = toPeerList(params.get("peers").getList());
        }

        return new HTTPAnnounceResponseMessage(data,
            params.get("interval").getInt(),
            params.get("complete").getInt(),
            params.get("incomplete").getInt(),
            peers);
    } catch (InvalidBEncodingException ibee) {
        throw new MessageValidationException("Invalid response " +
            "from tracker!", ibee);
    } catch (UnknownHostException uhe) {
        throw new MessageValidationException("Invalid peer " +
            "in tracker response!", uhe);
    }

没有诸如“间隔”或“完成”或“不完整”之类的键是参数。有两个键“peers”和“min interval”。

据我所知,在我调用客户端方法下载后,它从跟踪器请求了一些信息,然后尝试解析这些信息。这就是错误所在。

那么,问题是为什么会这样?是图书馆出错还是我有什么问题?

4

1 回答 1

1

问题到底是什么?

请编辑您的问题并添加更多详细信息。

理想情况下包括一个sscce

在您的问题中添加指向显示此错误的 torrent 文件的链接。你是如何构建 ttorrent 的?

确认您看到的错误是从 Android 运行时发生的,而不是在纯 Java 中发生的。

您可以使用 git 从 github 获取 ttorrent 代码或单击 github 项目上的按钮下载 zip。

ttorrent 使用 Maven。如果您手动获取依赖项,您可能无法获得正确的版本。您应该将代码作为 Maven 项目导入 Eclipse。Eclipse -> 文件 -> ...导入 -> Maven -> 现有的 Maven 项目

在导航器窗格中。找到 ttorrent 项目并右键单击选择 Run As -> Maven Build ... 对于“package”中的目标类型,然后单击“Run”。

我从 ttorrent 示例客户端开始,添加了一个已知良好的Ubuntu 13.04 torrent 文件的路径以及一个要保存到的目录。

我在调试器中运行了代码,并且 ttorrent 运行正常。它开始下载 Ubuntu 而不抛出异常或打印错误消息。

在您列出的行中,我看到 params 映射有四个条目(“interval”、“complete”、“peers”、“incomplete”)。

这是我使用的客户端代码:

public class ClientTest
{

    public static void main(String[] args) throws NoSuchAlgorithmException
    {    
        try {
            SharedTorrent fromFile =
            SharedTorrent.fromFile(
            new File("j:/ubuntu-13.04-desktop-amd64.iso.torrent"),
            new File("j:/td"));
            Client client =
                new Client(InetAddress.getLocalHost(), fromFile);
            client.download();
            client.waitForCompletion();
        } catch (UnknownHostException ex) {
            Logger.getLogger(ClientTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClientTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
于 2013-05-29T21:59:51.923 回答