Как подключить два Java-клиента, которые используют STUN, чтобы обойти NATS для P2P-соединения?

#java #networking #p2p #nat #stun

#Ява #сетевой #p2p #натуральный #оглушать

Вопрос:

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

Соответствующий код подключения:

 PeerConnection peerConn = new PeerConnection(pd);  PeerMessage toSend = new PeerMessage(msgType, msgData);  peerConn.sendData(toSend);    if (waitReply) {  PeerMessage oneReply = peerConn.receiveData();  while (oneReply != null) {  msgReply.add(oneReply);  oneReply = peerConn.receiveData();  }  }    peerConn.close();  
 public class PeerConnection {   private final PeerInfo pd;  private SocketInterface s;    public PeerConnection(PeerInfo info) throws IOException {  pd = info;  s = NormalSocketFactory.makeSocket(pd.getHost(), pd.getPort());  }  public void sendData(PeerMessage msg){ s.write(msg.toBytes()); }  public PeerMessage receiveData(){ return new PeerMessage(s); }  public void close() {if (s != null){ s.close(); s = null; } }  

Посторонние комментарии/try-catch и другие биты кода опущены для краткости.

Я вручную передаю IP-адрес и порт, заданные сервером STUN (для целей тестирования), в это одноранговое соединение, а другой код создает фактические данные (тип подключения, к кому он подключается и т. Д.), Но я не верю, что содержимое имеет какое-либо отношение к этому, поскольку оно может обрабатывать создаваемые входные пакеты (как проверено в локальной сети).

Я что-то здесь упускаю? Клиенты сидят там, слушая пакет, но не получают его. Использование WireShark (программы, в которой я, по общему признанию, новичок) показывает мне, что соединения сбрасываются (в частности, reset установлен флаг, чего я никоим образом не делаю).

 .... .... .1.. = Reset: Set  [Expert Info (Warning/Sequence): Connection reset (RST)]  [Connection reset (RST)]  [Severity level: Warning]  [Group: Sequence]  

У меня нет сервера сигнализации, обрабатывающего это, поскольку в настоящее время у меня нет планов размещать что-либо, но я не очень понимаю, как бы я не столкнулся с подобной проблемой.

РЕДАКТИРОВАТЬ: После использования WaifUPnP, чтобы разрешить открытие портов через брандмауэры, у меня все еще были проблемы с большинством подключений, которые я пытался протестировать. Я не знаю, является ли это симметричной проблемой NAT, но было установлено несколько соединений. Я не собираюсь удалять это на случай, если это кому-то еще понадобится позже.