2013-09-18 4 views
3

Вот и все. Вероятно, это вопрос новичков. Я почти отказываюсь от TcpClient/Listener из-за проблем с NAT и брандмауэром. Я хотел знать, есть ли альтернатива. порт 80, вероятно, не должен иметь дело с какой-либо из этих неприятных вещей. Надеюсь, ответ будет Да.Могу ли я использовать WebSockets для настольных приложений?

+0

Что вы используете для написания своего рабочего стола? Winforms? WPF? Также вы можете выбрать нужный порт с TcpClient и TcpListener – ppetrov

+0

Я использую WPF. Я знаю о порте. Я не упоминал об этом, потому что до сих пор я не знал, что у вас есть опция НЕ выбирать порт. Но я всегда думал, что это будет плохая практика программирования, или просто провалится, если я выберу порт, зарезервированный для протокола HTTP для отправки необработанных двоичных данных. Будет ли это работать? и будет ли он решить мои проблемы с NAT и брандмауэром? – user2212990

+0

Что вы пытаетесь сделать? Создать настольный сервер или клиент? Различие очень важно. – spender

ответ

2

Что можно сказать о SignalR над WebScockets

+0

Я никогда не слышал об этом, но после быстрого поиска в Google, я думаю, что это библиотека с открытым исходным кодом или проект? И могу ли я использовать это для настольных приложений? И решит ли он все мои проблемы с NAT и брандмауэром? – user2212990

+0

Мы не знаем, что такое ваши проблемы с NAT и брандмауэром. – spender

+0

@spender хорошо, сопоставление портов с использованием UPnP - это не точная наука, по-видимому. Некоторые маршрутизаторы возвращают null, когда вы запрашиваете их коллекцию статических сопоставлений, чтобы вы могли добавлять свои собственные, даже если они включены UPnP, у них просто нет действия. О брандмауэре некоторые из них, как и мой McAfee, незаметно блокируют подключение клиента к TcpListener, даже не спрашивая (я должен проверить историю брандмауэра, чтобы узнать, что соединение заблокировано). Я знаю, что есть способ добавить правила к брандмауэру Windows через код, но я хотел получить более общее решение. – user2212990

1

Да, вы можете реализовать WebSockets в приложении без браузера, но это не решит проблему.

При попытке открыть сервер, слушая подключения к веб-обозревателю, вы столкнетесь с той же проблемой, с которой вы столкнулись, когда вы создали обычное соединение сокета: личный межсетевой экран будет мешать, и не каждый маршрутизатор будет перенаправлять порт вы выбрали. Использование известного порта 80 вам не поможет. Для обычных потребителей довольно редко бывает, что веб-сервер работает за NAT-маршрутизатором, поэтому по умолчанию NAT-маршрутизатор не будет перенаправлять порт, если он специально не настроен для этого.

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

Хотя хостинг сервера по-прежнему не является бесплатным, он стал довольно дешевым из-за облачных хостеров, которые арендуют вам небольшие виртуализированные серверы по очень скромным ценам. Самый маленький экземпляр от Amazon EC2 стоит всего 2 цента в час или 14,40 доллара США в месяц. Или вы можете создать свой собственный сервер из некоторых запасных частей и разместить его на своем собственном интернет-соединении. Если у вас нет статического IP-адреса, вы можете использовать службу динамического сервера имен, например no-ip или DynDNS.

+0

Я хотел бы реализовать решение, о котором вы говорите, допустим, я настроил веб-сервер с dyndns или нет -ip, как я могу подключать клиентов друг к другу, есть ли способ, с помощью которого они напрямую соединяются через websocket, не проходя через сервер? –

+0

@MehdiKaramosly Думаю, я достаточно ясно объяснил, почему вам нужен центральный сервер. Когда у вас несколько клиентов, подключенных к вашему серверу, и хотите, чтобы они обменивались данными друг с другом, вам просто нужно слушать их сообщения и пересылать их по правому другому соединению. – Philipp

+0

спасибо за информацию, однако то, что я хотел знать, можно инициировать подключение сервером, а затем два одноранговых узла будут подключаться напрямую, не проходя через сервер, и кажется, что это невозможно. спасибо –

1

Да, вы можете, но, пожалуйста, не делайте этого. Я бы предложил изменить вашу архитектуру:

Используйте серверный сокет в качестве основного для обработки клиентов. Этот сервер должен иметь видимый IP/порт. В этом случае у вас могут быть клиенты за орехами, и не беспокойтесь.

Смежные вопросы