2012-02-18 17 views
3

Wifi経由のTCP接続を介して、C#.NET(Windowsアプリケーション)プログラムからJava(Android App)プログラムにデータを送信しようとしています。これまで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アドレスを返します。

AndroidのIPアドレス(192.168.1.6)に接続し、そこにデータを送信するためにWindowsアプリケーションでのC#コードを以下に示します。まあ

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

+0

clientSocketの宣言を投稿できますか? – joshhendo

+0

クライアント(C#)がサーバー(Java)への接続に失敗しています。つまり、データがクライアントから送信されていません。しかし、もしそれがつながったら、それは起こります。 – Krish

答えて

0

を呼び出して、私はこれを自分で解決してきたが、もちろんDilbertedの私に少しを支援してきました。彼が提供してくれたことに感謝します。別のスレッドがバックグラウンドでこのコードを実行するために使用されることを

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; 
} 

注::)

は、以下の解決Javaコードをチェックしてください。

1

アンドロイドアプリを起動してwifiに接続した後、アプリケーションが起動されたIPに対してpingを実行しようとしましたか?

ping 192.168.1.6 

IPは、C#のアプリが実行されているワークステーションからアクセス可能である場合、それが動作するかどうかを確認するために、アンドロイドIPのIPとポートにTelnetを実行してみてください。

telnet 192.168.1.6 8222 

2つの手順のいずれかが失敗すると、Wi-Fiネットワークで問題が発生する可能性があります。私は何度もルータのファイアウォールが8080と80以外のすべてのポートをフィルタリングしていることに気づいたので、ルータのポートを開く必要があります。

+0

'ping'と' telnet'の両方が動作しています。コマンドプロンプトで、IPアドレスで 'telnet'を入力すると、点滅するカーソル以外は何も表示されませんでした。私はそれを打ち込んだが、何も起こらなかった。それから、Androidデバイス(Javaコード)のアプリがフリーズしていることがわかりました。それを閉じた後、cmdの 'telnet'も閉じます。 Javaコードをデバッグすると、 'workerSocket = serverSocket.accept();'行でフリーズしていることに気づきました。 'ping'は正しく結果を出しました。それは働いている。 – Krish

+0

クライアントによってスローされる例外は何ですか?スタックトレースで例外を通知できますか? – Dilberted

+0

今、私たちはそれらの例外についてもう気にする必要はありません。私は自分で解決策を得て、今はC#からデータを受け取ります。しかし、それは最後の行でまだフリーズしています: 'inputText.setText(socketInputStream.readUTF())'。テキストをTextViewに設定してこれを取得する方法を教えていただけたら、自分で回答を投稿できます。 :) – Krish

0

これを実行しようとしましたか?

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

とあなたのスレッドから、のreadUTF()した後、まあ

runOnUiThread(showmessage); 

Found this here

+0

ありがとうございました。それは非常に有益であり、私はそれを実装します。私はすでに受け取ったバイトから文字列を取得し、それをRunnableを使わずにtextViewに設定することができました。しかし今、別の問題があります。私はすぐにそれを解決し、ここに投稿します。 :) – Krish

関連する問題