これは私の状況です (エミュレーターではなく実際のデバイスで): 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 通信が適切に機能することだけに関心があります。
私はあなたの助けを求め、あなたが私を助けることができれば本当に感謝します.