Связь 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, что и ПК.