我正在实现一个从 .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 中防火墙被禁用。
这些是一些通用的观察和故障排除方法,您可以尝试并让我了解更多信息,例如 GraalVM 版本、环境、错误消息等。
主要观察结果和潜在问题:
receive
呼叫:datagramSocket.receive(packet)
呼叫无限期阻塞,表明从跟踪器接收响应时出现问题。6969
。故障排除步骤:
1。添加超时
datagramSocket.setSoTimeout(5000); // Timeout after 5 seconds
SocketTimeoutException
以指示超时。2。检查跟踪器响应:
3.验证端口和地址:
4。使用不同的跟踪器进行测试:
5。回顾 GraalVM 网络:
6。调试和日志:
其他注意事项: