2012-02-18 64 views
3

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

以下是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)这意味着数据不会从客户端发出。但它会,如果它连接。请告诉我我错过了什么,我错在哪里。 :)

+0

究竟发生了什么?数据是否离开源计算机?它是否到达目标? – svick 2012-02-18 08:41:35

+0

你可以发布你的clientSocket的声明吗? – joshhendo 2012-02-18 09:00:26

+0

客户端(C#)无法连接到服务器(Java)这意味着数据不会从客户端发出。但它会,如果它连接。 – Krish 2012-02-18 09:22:38

回答

0

好了,我已经解决了这个自己,但当然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; 
} 

需要注意的是一个单独的线程将被用来在后台运行这段代码。

1

当你启动你的android应用程序并连接到无线网络后,你是否尝试对启动该应用程序的IP执行ping操作。

ping 192.168.1.6 

如果IP是从哪儿C#应用程序正在运行,尝试对android的IP的IP地址和端口远程登录,看看它是否有效与否的工作站访问。

telnet 192.168.1.6 8222 

如果两个步骤中的任何一个失败,则可能是wifi网络中的问题。正如我已经注意到很多时候,路由器的防火墙过滤掉除8080和80之外的所有端口。因此,您需要打开路由器上的端口。

+0

“ping”和“telnet”都在工作。在命令提示符下,当它输入到带有IP地址的telnet中时,除了闪烁的光标外,它什么也没有显示。我输入了它,但没有发生任何事情。然后我注意到,Android设备(Java代码)中的应用程序被冻结。关闭它后,cmd中的telnet也被关闭。在调试Java代码时,意识到它冻结在'workerSocket = serverSocket.accept();'行。 'ping'已经给出了正确的结果。所以它正在工作。 – Krish 2012-02-20 07:18:21

+0

客户端抛出的异常是什么?你能用堆栈跟踪发布异常吗? – Dilberted 2012-02-20 08:42:12

+0

现在我们不必再为这些异常烦恼了。我自己得到了解决方案,现在它从C#接收数据。但它仍然在最后一行冻结:'inputText.setText(socketInputStream.readUTF())',而不是继续前进。如果您可以告诉我如何将文本设置为TextView并使其工作,我可以自己发布答案。 :) – Krish 2012-02-20 12:28:35

0

您是否尝试过这样做?

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

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

runOnUiThread(showmessage); 

Found this here

+0

感谢您的支持。这是非常翔实的,我会执行它。我已经设法从接收到的字节中获取字符串,并将其设置为textView而不使用Runnable。但现在又出现了另一个问题我会很快解决它,并在这里发布。 :) – Krish 2012-02-22 04:32:49

相关问题