【问题标题】:Android to PC TCP communication working only on EmulatorAndroid 到 PC 的 TCP 通信仅在模拟器上工作
【发布时间】:2014-07-18 14:43:27
【问题描述】:

我需要实现一个 android 应用程序以通过TCP (wifi) 与 PC 上的c# 应用程序通信。我已经关注了这个 -

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

使用eneter 库实现解决方案的教程。

这在模拟器上工作得很好,因为 C# 应用程序使用的 IP 是

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

Android 应用使用的 IP 是

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

但是,当我将 android 应用程序传输到实际设备并尝试通过 wifi 传输数据时,C# 应用程序不会显示从移动设备传输的字符串,如教程中所示。

我尝试的修复是,

  • 保持 C# IP 原样 (127.0.0.1) 并将 android IP 更改为运行 c# 应用程序的 PC 的 IP (192.168.137.1)。
  • 有效的修复: 将 C# IP 更改为 PC 的实际 IP (192.168.137.1),并将 android 应用程序的 IP 地址更改为 android 设备的实际 IP (192.168.137.1)。
  • 仅供参考:我没有更改端口号

这些修复并没有解决问题,我不知道如何做到这一点。这几天我尝试了很多解决方案,因为我是tcp 编程领域的新手。

非常感谢您提供有关如何解决此问题的专家建议。

非常感谢您的帮助:)

提前致谢。

附言

  • PC 的实际 IP(使用 C# 程序)-192.168.137.1
  • 安卓设备的实际IP(带有安卓应用)-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): ==========

【问题讨论】:

  • 您确定您的 PC 的 Windows 防火墙允许该连接吗?
  • 这是正确的:“保持 C# IP 原样 (127.0.0.1) 并将 android IP 更改为运行 c# 应用程序的 PC 的 IP (192.168.137.1)。”
  • 您应该考虑关闭防火墙或 PC 中的任何防病毒应用程序
  • @JustAndrei 谢谢你的回复..哦,我忘了检查..我会检查并回复:)
  • @Coderji 非常感谢您的回复先生。但是 JustAndrei 事先发布了答案,因此他的答案将被接受:)

标签: c# android tcp ip loopback-address


【解决方案1】:

应将 Windows 防火墙配置为允许或关闭该连接。

【讨论】:

    【解决方案2】:

    现在回答这个帖子有点晚了,但我已经设法使用这个项目在我的电脑和平板电脑之间进行通信。 我尝试了许多 IP 地址的组合,发现它仅在 PC NetService (c#) 和 Android 通信客户端中的 IP 地址相同并且由我自己的网络 IP 地址定义时才有效,例如下面给出的示例中的“192.168.1.155”: IE。在c#NetService程序中:

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

    在 Android 客户端程序中:

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

    当平板电脑使用平板电脑的家庭 wi-fi 通过 USB 连接到我的 PC 时,该程序的工作方式如文章中所述。 当 USB 与平板电脑断开连接显示连接是通过 wi-fi 时,它也可以工作。 如果我在任一包中使用 IP“10.0.2.2”和“127.0.0.1”,该程序将无法运行。 如果平板电脑没有使用与 PC 相同的 wi-fi,它也不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多