0

これは私の状況です (エミュレーターではなく実際のデバイスで): TCP を介して一部のデータを別のソフトウェアにストリーミングする App_A があり、同じデバイス上の App_B である可能性
ありますApp_Aのユーザー マニュアルでは、App_A で提供されるオプションを使用して、destination_IP を "localhost" に、destination_port を "8888" に変更するだけで、同じデバイス上の別のアプリ (この場合は App_B) にデータをストリーミングできると言わ
ます。 したがって、データ フローはsourceからApp_aへ、そして最後にApp_Bへと流れます。

このシナリオでは、App_B を、デバイス上のストリーミングされた TCP データをリッスンする TCP クライアント アプリとして開発しています。

これは私が書いたコードです(ウェブで見つけました):

主な活動

public class MainActivity extends AppCompatActivity {

  TcpClient mTcpClient;
  Context context;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      context = this;
      new ConnectTask().execute("");
  }


  public class ConnectTask extends AsyncTask<String, String, TcpClient> {

      @Override
      protected TcpClient doInBackground(String... message) {

        //we create a TCPClient object
        mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
            @Override
            //here the messageReceived method is implemented
            public void messageReceived(String message) {
                //this method calls the onProgressUpdate
                publishProgress(message);
            }
        });
        mTcpClient.run();

        return null;
      }

      @Override
      protected void onProgressUpdate(String... values) {
          super.onProgressUpdate(values);
          //response received from server
          Toast.makeText(context, "Ricevo "+values[0], Toast.LENGTH_LONG).show();
          Log.e("test", "response " + values[0]);
          //process server response here....

      }
  }
}

TCP_CLIENT

public class TcpClient {

  public static final String SERVER_IP = "localhost";
  public static final int SERVER_PORT = 8888;

  private String mServerMessage;
  private OnMessageReceived mMessageListener = null;

  private boolean mRun = false;
  private PrintWriter mBufferOut;
  private BufferedReader mBufferIn;


  public TcpClient(OnMessageReceived listener) {
      mMessageListener = listener;
  }

  public void sendMessage(String message) {
      if (mBufferOut != null && !mBufferOut.checkError()) {
          mBufferOut.println(message);
          mBufferOut.flush();
      }
  }

  public void stopClient() {

      mRun = false;

      if (mBufferOut != null) {
          mBufferOut.flush();
          mBufferOut.close();
      }

      mMessageListener = null;
      mBufferIn = null;
      mBufferOut = null;
      mServerMessage = null;
  }

  public void run() {

      mRun = true;

      try {
        InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

        Log.e("TCP Client", "C: Connecting...");

        try (Socket socket = new Socket(serverAddr, SERVER_PORT)) {

            //sends the message to the server
            mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

            //receives the message which the server sends back
            mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));


            //in this while the client listens for the messages sent by the server
            while (mRun) {

                mServerMessage = mBufferIn.readLine();

                if (mServerMessage != null && mMessageListener != null) {
                    //call the method messageReceived from MyActivity class
                    mMessageListener.messageReceived(mServerMessage);
                }

            }

            Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");

        } catch (Exception e) {

            Log.e("TCP", "S: Error", e);

        }
        //the socket must be closed. It is not possible to reconnect to this socket
        // after it is closed, which means a new socket instance has to be created.


      } catch (Exception e) {

          Log.e("TCP", "C: Error", e);

      }

  }

  public interface OnMessageReceived {
      public void messageReceived(String message);
  }

 } 

私の問題は、Socket コンストラクター (TcpClient Class > run method > try with resources ステートメント) の最初の引数として設定したすべての値が、次の例外をスローすることです。
java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 8888): connect failed: ECONNREFUSED (Connection refused)

次のステートメントをすべて書き込もうとしましたが、この問題を解決できません。
try (Socket socket = new Socket("localhost", SERVER_PORT)) ....
try (Socket socket = new Socket("127.0.0.1", SERVER_PORT)) ....
try (Socket socket = new Socket(InetAddress.getByName(SERVER_IP), SERVER_PORT)) ....
try (Socket socket = new Socket(InetAddress.getLocalHost(), SERVER_PORT)) ....

エミュレーターでローカルホストにアクセスする必要がある場合にのみ、ローカルホスト IP を「10.0.2.2」にする必要があることを読みましたが、これは私の場合ではありません。とにかく、デバイスでこのオプションも試しましたが、機能せず、ETIMEDOUT (接続タイムアウト) の ConnectException がスローされます。

私のコードがこのケースに最適化されていないことはわかっていますが、現在、パフォーマンスの問題ではなく、TCP 通信が適切に機能することだけに関心があります。
私はあなたの助けを求め、あなたが私を助けることができれば本当に感謝します.

4

0 に答える 0