Как я могу создать.торрент на Java?

Я хочу создать .торрент-файл на Java, но мне не нужен большой API, который делает что-то вроде очистки трекеров, посева и т. д. Это только для клиента, который генерирует метаданные. Какие легкие решения существуют? Я только генерирую a .поток сингла .сжатый файл.

спасибо!

2 ответов


я собрал этот автономный кусок кода Java для подготовки .торрент-файл с одним файлом.

The .файл torrent создается путем вызова createTorrent() передача имени .торрент-файл, название файла и URL трекера.

createTorrent() использует hashPieces() для хэша файла штук использование Java MessageDigest класса. Тогда createTorrent() готовит словарь мета-информации содержит метаданные торрента. Этот словарь затем сериализуется в правильном bencode формат с помощью encode*() методы и сохранены в a .торрент-файл.

посмотреть спецификация BitTorrent для сведения.

public class Torrent {
    private static void encodeObject(Object o, OutputStream out) throws IOException {
        if (o instanceof String)
            encodeString((String)o, out);
        else if (o instanceof Map)
            encodeMap((Map)o, out);
        else if (o instanceof byte[])
            encodeBytes((byte[])o, out);
        else if (o instanceof Number)
            encodeLong(((Number) o).longValue(), out);
        else
            throw new Error("Unencodable type");
    }
    private static void encodeLong(long value, OutputStream out) throws IOException {
        out.write('i');
        out.write(Long.toString(value).getBytes("US-ASCII"));
        out.write('e');
    }
    private static void encodeBytes(byte[] bytes, OutputStream out) throws IOException {
        out.write(Integer.toString(bytes.length).getBytes("US-ASCII"));
        out.write(':');
        out.write(bytes);
    }
    private static void encodeString(String str, OutputStream out) throws IOException {
        encodeBytes(str.getBytes("UTF-8"), out);
    }
    private static void encodeMap(Map<String,Object> map, OutputStream out) throws IOException{
        // Sort the map. A generic encoder should sort by key bytes
        SortedMap<String,Object> sortedMap = new TreeMap<String, Object>(map);
        out.write('d');
        for (Entry<String, Object> e : sortedMap.entrySet()) {
            encodeString(e.getKey(), out);
            encodeObject(e.getValue(), out);
        }
        out.write('e');
    }
    private static byte[] hashPieces(File file, int pieceLength) throws IOException {
        MessageDigest sha1;
        try {
            sha1 = MessageDigest.getInstance("SHA");
        } catch (NoSuchAlgorithmException e) {
            throw new Error("SHA1 not supported");
        }
        InputStream in = new FileInputStream(file);
        ByteArrayOutputStream pieces = new ByteArrayOutputStream();
        byte[] bytes = new byte[pieceLength];
        int pieceByteCount  = 0, readCount = in.read(bytes, 0, pieceLength);
        while (readCount != -1) {
            pieceByteCount += readCount;
            sha1.update(bytes, 0, readCount);
            if (pieceByteCount == pieceLength) {
                pieceByteCount = 0;
                pieces.write(sha1.digest());
            }
            readCount = in.read(bytes, 0, pieceLength-pieceByteCount);
        }
        in.close();
        if (pieceByteCount > 0)
            pieces.write(sha1.digest());
        return pieces.toByteArray();
    }
    public static void createTorrent(File file, File sharedFile, String announceURL) throws IOException {
        final int pieceLength = 512*1024;
        Map<String,Object> info = new HashMap<String,Object>();
        info.put("name", sharedFile.getName());
        info.put("length", sharedFile.length());
        info.put("piece length", pieceLength);
        info.put("pieces", hashPieces(sharedFile, pieceLength));
        Map<String,Object> metainfo = new HashMap<String,Object>();
        metainfo.put("announce", announceURL);
        metainfo.put("info", info);
        OutputStream out = new FileOutputStream(file);
        encodeMap(metainfo, out);
        out.close();
    }

    public static void main(String[] args) throws Exception {
        createTorrent(new File("C:/x.torrent"), new File("C:/file"), "http://example.com/announce");
    }
}

изменять код: сделайте это немного более компактным, исправьте видимость методов, используйте символьные литералы, где это необходимо, используйте instanceof Number. И совсем недавно чтение файла с помощью блока ввода-вывода потому что я пытаюсь использовать его для реального и байтового ввода-вывода просто медленно,


Я бы начал с Ява торрент с API. Jar составляет около 70Kb, но вы, вероятно, можете удалить его, удалив классы, не необходимые для создания торрентов. SDK имеет образец ExampleCreateTorrent.java иллюстрируя, как сделать именно то, что вам нужно.

вы также можете посмотреть, как это реализовано в Java-клиентах с открытым исходным кодом, таких как Azureus.