В настоящее время я работаю над программой обмена сообщениями в Java, и я планировал использовать UDP для отправки сообщений от пользователя на центральный сервер, и я планировал использовать, возможно, TCP для сообщений с сервера, возвращающихся к пользователю. Мой главный вопрос: как я могу достичь этого, не требуя, чтобы клиент переместился?Почему программы, подобные Skype, не требуют от вас открытия портов?
ответ
Очень просто, клиент должен установить TCP-соединение с сервером, даже если первичный (действительно, если не только) поток данных находится в противоположном направлении.
Такие программы, как skype, используют общий открытый порт (порт 80) или помещают в брандмауэр правило, позволяющее другому порту взаимодействовать. Кроме того, программа может открывать порты выше 1024 без административных разрешений, хотя в зависимости от типа подключения может потребоваться настройка UPnP или сохранение активного канала на сервере.
И как именно несколько программ могут совместно использовать один и тот же порт, но когда я случайно покидаю экземпляр моего сервера, я получаю исключение из-за того, что порт уже используется? – Kristoff
Когда программа открывает порт, он может установить, что порт является неэксклюзивным, если он хочет поделиться этим портом. Значение по умолчанию обычно является исключительным, поэтому вы получите эту ошибку. – MiltoxBeyond
Клиенты P2P, такие как skype, используют тонкие трюки для подключения пэров за брандмауэрами. Используются различные методы, используемые здесь: http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html
- 1. Почему программы C требуют декомпиляторов, но программы python не?
- 2. Как работает Skype без переадресации портов?
- 3. запуска PHP программы Skype
- 4. Имеет ли нестатический IP-адрес вас от перенаправления портов?
- 5. Ограничить ненадежный код от создания веб-запросов и открытия портов
- 6. Skype Ошибка программы API запустить
- 7. Предотвращение открытия программы программой
- 8. Общий способ открытия портов для SQL Server
- 9. Почему некоторые программы требуют, чтобы оба .lib и .dll работали ...
- 10. Gui с кнопкой для открытия сканера портов
- 11. Почему Фрагменты требуют транзакции?
- 12. Почему Граватар требует от вас хэш-сообщения?
- 13. Почему Files.lines (и подобные потоки) не закрываются автоматически?
- 14. Использование subprocess.call для открытия программы
- 15. Предотвращение Eclipse от открытия внешней программы внутри редактора Eclipse
- 16. Почему CSS не поддерживает функционально-подобные конструкции?
- 17. Почему Chrome/Chromium и Android не требуют авторизации API
- 18. Использование HTML для открытия программы с переменными
- 19. 2 подобные программы C с макро не производить различные выходные
- 20. Jquery Validate требуют от группы не работает
- 21. Почему классы immutable.js не требуют «новых»?
- 22. Почему не изменяемые объекты требуют двойных указателей?
- 23. Почему модули не всегда «требуют» в рубине?
- 24. Как программы, написанные на Java, не требуют JRE?
- 25. Python Как делиться данными типа skype?
- 26. Подобные переменные не похожи
- 27. BATCH Предотвращение открытия пользователем файла извне программы?
- 28. Почему докер использует номера портов от 32768-65535?
- 29. Принимая входные данные от портов
- 30. Skype бот не работает
Я не понимал, что движение может идти в обратном направлении! Я думал, что TCP требуется как для создания соединения, так и из-за характера TCP (трехстороннее рукопожатие). Спасибо, что поняли это для меня! – Kristoff
Любые брандмауэры/NAT в пути позволят завершить трехстороннее квитирование (при условии, что исходящий трафик разрешен), в противном случае TCP-соединение никогда не будет работать. – Alnitak