【问题标题】:Unable to send data from C# to Java (Android) program无法将数据从 C# 发送到 Java (Android) 程序
【发布时间】:2012-03-09 11:50:08
【问题描述】:

我正在尝试通过 Wifi 通过 TCP 连接将数据从 C#.NET(Windows 应用程序)程序发送到 Java(Android 应用程序)程序,反之亦然。到目前为止,我成功地将数据从 Java 发送到 C#,但无法从 C# 发送到 Java。

下面是Java代码,我是用来创建连接和接收数据的:

ServerSocket serverSocket = null;
DataInputStream socketInputStream;
while (true) {
        try {
            String localIPAddr = getLocalIPAddress();
            InetSocketAddress ipEndPoint = new InetSocketAddress(
                    InetAddress.getByName(localIPAddr), 8222);
            serverSocket = new ServerSocket();
            serverSocket.bind(ipEndPoint, 4);
            workerSocket = serverSocket.accept();

            socketInputStream = new DataInputStream(
                    workerSocket.getInputStream());
            inputText.setText(socketInputStream.readUTF());
        } catch (Exception ex) {
            throw ex;
        }
    }

这里getLocalIPAddress()方法返回Android设备的IP地址。

以下是 Windows 应用程序中的 C# 代码,用于连接到 Android 的 IP 地址 (192.168.1.6) 并向其发送数据:

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (!clientSocket.Connected)
                    clientSocket.Connect(IPAddress.Parse("192.168.1.6"), 8222);
                clientSocket.Send(Encoding.UTF8.GetBytes(txtInput.Text));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

好吧,客户端 (C#) 无法连接到服务器 (Java) 这意味着数据没有从客户端离开。但它会,如果它得到连接。请告诉我我错过了什么以及我在哪里弄错了。 :)

【问题讨论】:

  • 到底发生了什么?数据是否离开源计算机?它到达目标了吗?
  • 你能发布你的clientSocket声明吗?
  • 客户端 (C#) 无法连接到服务器 (Java) 这意味着数据没有从客户端离开。但它会,如果它得到连接。

标签: java c# android sockets tcp


【解决方案1】:

在你启动你的安卓应用并连接到 wifi 后,你有没有尝试对启动应用的 ip 执行 ping 操作。

ping 192.168.1.6

如果可以从运行C#应用程序的工作站访问该IP,请尝试在该android ip的IP和端口上执行telnet,看看它是否有效。

telnet 192.168.1.6 8222

如果这两个步骤中的任何一个失败,则可能是 wifi 网络出现问题。正如我多次注意到的,路由器的防火墙过滤掉了除 8080 和 80 之外的所有端口。所以你需要打开路由器上的端口。

【讨论】:

  • pingtelnet 都在工作。在命令提示符下,当它使用 IP 地址输入telnet 时,除了闪烁的光标外什么也没有显示。我输入了它,但什么也没发生。然后我注意到,Android 设备(Java 代码)中的应用程序被冻结。关闭后,cmd中的telnet也被关闭了。调试 Java 代码时,发现它在workerSocket = serverSocket.accept(); 行冻结。 ping 给出了正确的结果。所以它正在工作。
  • 客户端抛出的异常是什么?你能用堆栈跟踪发布异常吗?
  • 现在我们不必再为这些异常烦恼了。我自己得到了解决方案,现在它正在从 C# 接收数据。但它仍然在最后一行冻结:inputText.setText(socketInputStream.readUTF()) 并且没有继续前进。如果您能告诉我如何将文本设置为 TextView 并使其正常工作,我可以自己发布答案。 :)
  • 现在只想知道如何从 C# 代码发送的字节中获取字符串。
【解决方案2】:

您是否尝试过这样做?

Runnable showmessage = new Runnable() { 
        public void run() { 
               myTextView.setText(membervariabletext); 
        } 
};

在你的线程中,在 readUTF() 之后,调用

runOnUiThread(showmessage);

Found this here

【讨论】:

  • 感谢这个。这是非常有用的,我会实施它。我已经设法从接收到的字节中获取字符串并将其设置为 textView 而无需使用 Runnable。但现在又遇到了一个问题。我会很快解决它并在这里发布。 :)
【解决方案3】:

好吧,我自己解决了这个问题,当然Dilberted 帮助了我一点。我感谢他所提供的。 :)

查看下面已解决的 Java 代码:

ServerSocket serverSocket = null;
Socket workerSocket;
DataInputStream socketInputStream;
try {
    if (serverSocket == null) {
        // No need to get local IP address and to bind InetSocketAddress.
        // Following single line make it very simple.
        serverSocket = new ServerSocket(8222, 4);
        workerSocket = serverSocket.accept();
    }
    // When data are accepted socketInputStream will be invoked.
    socketInputStream = new DataInputStream(
                workerSocket.getInputStream());

    /* Since data are accepted as byte, all of them will be collected in the
    following byte array which initialised with accepted data length. */
    byte[] rvdMsgByte = new byte[socketInputStream.available()];

    // Collecting data into byte array
    for (int i = 0; i < rvdMsgByte.length; i++)
        rvdMsgByte[i] = socketInputStream.readByte();

    // Converting collected data in byte array into String.
    String rvdMsgTxt = new String(rvdMsgByte);

    // Setting String to the text view.
    receivedMsg.setText(rvdMsgTxt);
} catch (Exception ex) {
    throw ex;
}

请注意,将使用单独的线程在后台运行此代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2018-05-11
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多