とても小さいメッセージングアプリを作っています。私は、サーバからのメッセージを聞く1つの非同期タスクと、サーバにメッセージを送り、メッセージをエコーバックする別の非同期タスクを持っています。何らかの理由で、私は同時にサーバーを送受信できません。これは何が起こるかの順序です:アンドロイド - 同じIPとポートに2つのソケットを実行するにはどうすればいいですか?
1.ユーザーAがメッセージを入力して送信をクリックします。何も起こりません。 2.ユーザーB(リスニング非同期タスクをオフにしている)を送信し、メッセージを送信します。 その後、userAのメッセージがユーザーBに戻ってきます。なぜ私はユーザーAが同時にメッセージを送受信できないのか分かりません。ここに私の2つの非同期タスクがあります。
private class CommunicateWithServerAsyncTask extends AsyncTask<Void,Void,Void>
{
private String jsonReply = "";
private String jsonOutputToServer = "";
public CommunicateWithServerAsyncTask(String jsonMessage)
{
this.jsonOutputToServer = jsonMessage;
}
@Override
protected Void doInBackground(Void... params)
{
Log.d(SOCKET_TESTING_TAG,"break 1");
try
{
Log.d(SOCKET_TESTING_TAG,"break 2");
Socket socket = new Socket("ip",portNumber);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
printWriter.println(jsonOutputToServer);
printWriter.flush();
jsonReply = bufferedReader.readLine();
Log.d(SOCKET_TESTING_TAG,"break 2");
if(jsonReply != null && !jsonReply.equals(""))
{
Log.d(SOCKET_TESTING_TAG,"break 3");
Log.d(SOCKET_TESTING_TAG,"my message is " + jsonReply);
}
else
{
Log.d(SOCKET_TESTING_TAG,"break 4");
Log.d(SOCKET_TESTING_TAG,"no message yet");
}
printWriter.close();
bufferedReader.close();
socket.close();
}
catch (IOException e)
{
Log.d(SOCKET_TESTING_TAG,"failed " + e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
public void onPostExecute(Void var)
{
displayMessageFromServer(jsonReply,false);
}
}
第二非同期タスク
private class ListenForMessagesAsyncTask extends AsyncTask<Void,Void,Void>
{
private String jsonReply = "";
//private BufferedReader bufferedReader;
@Override
protected Void doInBackground(Void... params)
{
Log.d(SOCKET_TESTING_TAG,"break A");
try
{
Socket socket = new Socket("52.91.109.76",1234);;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (isListeningForMessages)
{
Log.d(SOCKET_TESTING_TAG,"break D");
Log.d(SOCKET_TESTING_TAG,"my buffer reader value is " + String.valueOf(bufferedReader.ready()));
if(bufferedReader.ready())
{
Log.d(SOCKET_TESTING_TAG,"break E");
jsonReply = (String) bufferedReader.readLine();
Log.d(SOCKET_TESTING_TAG,"break F");
isListeningForMessages = false;//we have a reply, close the while loop and Async Task.
Log.d(SOCKET_TESTING_TAG,"my listening message is " + jsonReply);
}
}
bufferedReader.close();
socket.close();
}
catch (IOException e)
{
Log.d(SOCKET_TESTING_TAG,"failed " + e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
public void onPostExecute(Void var)
{
displayMessageFromServer(jsonReply,true);
}
}
私は 'のreadLine(https://stackoverflow.com/q/47899231/207421というあなたの[前の質問](https://stackoverflow.com/q/47899231/207421)に私の答えにあなたに言いました) 'nullを返すことは、 'まだメッセージがありません'という意味ではなく、何を意味しているのでしょうか。 – EJP
したがって、非同期タスクは、2つのデバイス上の異なるクライアントアプリケーションで使用されます。なぜあなたはあなたに言ったのですか? – greenapps
異なるクライアントによって受信されるメッセージは、サーバーが送信する内容と送信者によって異なります。あなたはあなたのサーバーについて何も言わなかった。あなたはあなたのサーバーコードを投稿しませんでした。だから何が起こるべきかを私たちはどのように知るべきですか – greenapps