Отладка удаленных подключений Akka.NET (невозможно подключиться - не удалось привязать)

Используя пример проекта Chat Server/Client, доступного как часть исходного кода Akka.NET, я попытался изменить его так, чтобы он успешно работал на двух компьютерах в моей сети.

У меня есть две системы, которые подключены через такой роутер

192.168.0.29 (Server) <---------------| Router |---------------> 192.168.0.52 (Client)

Затем у меня есть две системы акторов, которые настроены следующим образом:

Сервер:

akka {  
    actor {
        provider = remote #Specify remote provider
    }
    remote {

        dot-netty.tcp {
            port = 666 #Akka server port number
            hostname = 0.0.0.0 #Bind to all local network interfaces
            public-hostname = 192.168.0.29 #Expose public IP to enable correct routing of public messages.

        }
    }
}

Клиент:

akka {  
    actor {
        provider = remote
    }
    remote {
        dot-netty.tcp {
            port = 0 #Tell Akka that this is a client connection/use random port.
            hostname = 192.168.0.29 #Tell Akka.NET which remote instance to connect to
        }
    }
}

К сожалению, хотя я могу успешно подключиться к серверу чата локально, независимо от того, как я настраиваю свой Hocon, я не могу заставить удаленный экземпляр привязаться к моему субъекту сервера, расположенному на машине 192.168.0.29.

Конкретное сообщение об ошибке, которое я получаю

[ERROR][27/11/2019 4:58:36 PM][Thread 0004][Akka.Remote.Transport.DotNetty.TcpTransport] Failed to bind to 192.168.0.29:0; shutting down DotNetty transport.
Cause: System.Net.Sockets.SocketException (10049): The requested address is not valid in its context
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)

Это сообщение об ошибке говорит мне, что нет доступного сокета, к которому Akka.NET может получить доступ.

Как ни странно, некоторое время назад я задал очень похожий вопрос, который в то время помог мне решить мои проблемы с подключением, но до недавнего времени я никогда не использовал Akka.NET.

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

Исходный исходный код серверного / клиентского приложения Akka.NET находится здесь, моя текущая версия находится здесь.

Может ли кто-нибудь дать представление о том, что я делаю неправильно и как я могу улучшить отладку удаленных подключений Akka.NET? Например, есть способ проверить, что система Актеров на сервере192.168.0.29 доступен из 192.168.0.52 внешне?

1 ответ

Ха-ха, и буквально через 5 минут после публикации моего вопроса я наконец смог определить решение (хотя оно не идеальное).

Решением было осознание того, что при создании экземпляра ActorSystem в клиентском приложении вы НЕ подключаете локальную систему акторов к удаленной системе, НО, а создаете локальный экземпляр системы акторов, которая сама прослушивает случайный порт.

Само удаленное подключение происходит, когда вы создаете ActorSelection() ссылка.

Так что все, что мне нужно было сделать, это сменить имя моего клиента с

hostname = 192.168.0.29

К

hostname = 192.168.0.52

Однако это создает одну последнюю (хотя и довольно небольшую) проблему. Теперь мне нужен другой файл hocon для экземпляра, работающего локально, по сравнению с экземпляром, работающим удаленно. По общему признанию, это, вероятно, можно было бы решить с помощью кода...

Я был бы счастлив отметить в качестве решения того, кто мог бы предложить что-то, что решает эту проблему.

Другие вопросы по тегам