Связь TCP с Android на ПК работает только на эмуляторе

У меня есть требование для реализации приложения Android для связи с c# приложение на ПК более TCP (Wi-Fi). Я следил за этим -

https://workspaces.codeproject.com/dhl_hh/android-how-to-communicate-with-net-application-vi

учебник для реализации решения, которое использует eneter библиотека.

Это прекрасно работает на эмуляторе, так как IP используется для C# приложение

IDuplexInputChannel anInputChannel
            = aMessaging.CreateDuplexInputChannel("tcp://127.0.0.1:8060/"); 

и IP используется для Android приложение

IDuplexOutputChannel anOutputChannel
        = aMessaging.createDuplexOutputChannel("tcp://10.0.2.2:8060/");

Тем не менее, когда я переношу приложение Android на реальное устройство и попытаюсь передать данные через wifi Приложение C# не отображает строку, переданную с мобильного устройства, как показано в руководстве.

Исправления, которые я попробовал, были:

  • Сохраняйте C# IP как есть (127.0.0.1) и меняйте IP андроида на IP ПК (192.168.137.1), где работает приложение C#.
  • Исправление, которое работает: изменил IP-адрес C# на фактический IP-адрес ПК (192.168.137.1) и изменил IP-адрес приложения Android на фактический IP-адрес устройства Android (192.168.137.1).
  • К вашему сведению: я не изменил номер порта

Эти исправления не помогли решить проблему, и я понятия не имею, как это сделать. Я пробовал много решений в течение нескольких дней, так как я новичок в области tcp программирование.

Буду очень признателен вам, совет экспертов, как решить эту проблему.

Вы помогаете с благодарностью:)

Заранее спасибо.

PS

  • Фактический IP-адрес ПК (с программой C#) - 192.168.137.1
  • Фактический IP устройства Android (с приложением Android) - 192.168.137.14

Выход Logcat

05-29 12:49:17.988: E/EneterMessaging(1792): ~  1 eneter.messaging.endpoints.typedmessages.DuplexTypedMessageSender.sendRequestMessage DuplexTypedMessageSender<MyResponse, MyRequest> atached to the duplex output channel '' failed to send the request message because it is not attached to any duplex output channel.
05-29 12:49:17.988: E/EneterMessaging(1792): ~  1 net.client.AndroidNetCommunicationClientActivity.onSendRequest Sending the message failed.

05-29 12:49:17.988: E/EneterMessaging(1792): Exception:

05-29 12:49:17.988: E/EneterMessaging(1792): java.lang.IllegalStateException: DuplexTypedMessageSender<MyResponse, MyRequest> atached to the duplex output channel '' failed to send the request message because it is not attached to any duplex output channel.

05-29 12:49:17.988: E/EneterMessaging(1792): eneter.messaging.endpoints.typedmessages.DuplexTypedMessageSender.sendRequestMessage(DuplexTypedMessageSender.java:67)

05-29 12:49:17.988: E/EneterMessaging(1792): net.client.AndroidNetCommunicationClientActivity.onSendRequest(AndroidNetCommunicationClientActivity.java:120)

05-29 12:49:17.988: E/EneterMessaging(1792): net.client.AndroidNetCommunicationClientActivity.access$1(AndroidNetCommunicationClientActivity.java:111)

05-29 12:49:17.988: E/EneterMessaging(1792): net.client.AndroidNetCommunicationClientActivity$2.onClick(AndroidNetCommunicationClientActivity.java:160)

05-29 12:49:17.988: E/EneterMessaging(1792): android.view.View.performClick(View.java:4102)

05-29 12:49:17.988: E/EneterMessaging(1792): android.view.View$PerformClick.run(View.java:17084)

05-29 12:49:17.988: E/EneterMessaging(1792): android.os.Handler.handleCallback(Handler.java:615)

05-29 12:49:17.988: E/EneterMessaging(1792): android.os.Handler.dispatchMessage(Handler.java:92)

05-29 12:49:17.988: E/EneterMessaging(1792): android.os.Looper.loop(Looper.java:155)

05-29 12:49:17.988: E/EneterMessaging(1792): android.app.ActivityThread.main(ActivityThread.java:5520)

05-29 12:49:17.988: E/EneterMessaging(1792): java.lang.reflect.Method.invokeNative(Native Method)

05-29 12:49:17.988: E/EneterMessaging(1792): java.lang.reflect.Method.invoke(Method.java:511)

05-29 12:49:17.988: E/EneterMessaging(1792): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)

05-29 12:49:17.988: E/EneterMessaging(1792): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)

05-29 12:49:17.988: E/EneterMessaging(1792): dalvik.system.NativeStart.main(Native Method)

05-29 12:49:17.988: E/EneterMessaging(1792): ==========

2 ответа

Решение

Брандмауэр Windows должен быть настроен на разрешение этого соединения или отключен.

Уже немного поздно, чтобы ответить на этот пост, но мне удалось установить связь между моим ПК и планшетом с помощью этого проекта. Я перепробовал множество комбинаций IP-адресов и обнаружил, что он работает только тогда, когда IP-адреса в ПК NetService (C#) и Android Communication Client совпадают и определяются моим собственным сетевым IP-адресом, например, "192.168.1.155" в приведенном примере. ниже: т.е. в программе C# NetService:

IDuplexInputChannel anInputChannel = aMessaging.CreateDuplexInputChannel ("tcp: //192.168.1.155: 4080 /");

и в клиентской программе Android:

IDuplexOutputChannel anOutputChannel = aMessaging.createDuplexOutputChannel ("tcp: //192.168.1.155: 4080 /");

Программа работает, как описано в статье, когда планшет подключен через USB к моему компьютеру с помощью домашнего Wi-Fi для планшета. Он также работает, когда USB отключен от планшета, показывая, что соединение через Wi-Fi. Программа не работала, если я использовал IP "10.0.2.2" и "127.0.0.1" в любом пакете. Это также не работает, если планшет не использует тот же Wi-Fi, что и ПК.

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