dimanche 8 mars 2015

Android TCP multicast missing message



I build a TCP multicast chat application using asynctask. I am also trying to order the message in FIFO and causal order.


However, when I try to send a lot of messages simultaneously for testing, it misses some messages but I can't find the reason. I have tried as hard as I can to improve the performance of the program because I thought the performance could be the reason. but still having the same issue. I attached some important part of my code. Most of all,



private class ServerTask extends AsyncTask<ServerSocket, String, Void> {

@Override
protected Void doInBackground(ServerSocket... sockets){
ServerSocket serverSocket = sockets[0];
Socket socket = new Socket();
try {
while(true) {
socket = serverSocket.accept();
InputStream inputstream = socket.getInputStream();
DataInputStream in = new DataInputStream(new BufferedInputStream(inputstream));

String msg = ""+in.readUTF();
String time = ""+in.readUTF();

String temp = time+"||"+msg;
publishProgress(temp);
in.close();


}} catch (IOException e) {
e.printStackTrace();
} finally{
try {
socket.close();
serverSocket.close();////
} catch (IOException e) {
e.printStackTrace();
}

}

return null;
}


Here is onProgressUpdate.



protected void onProgressUpdate(String...strings) {
/*
* The following code displays what is received in doInBackground().
*/
String strReceived = strings[0].trim();
TextView remoteTextView = (TextView) findViewById(R.id.textView1);
remoteTextView.append(strReceived + "\t\n");
try {
sequencer(strReceived);
} catch (ParseException e) {
e.printStackTrace();
}


return;
}
}


Sequencer



public void sequencer(String received) throws ParseException {

SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
String time = received.split("\\|\\|")[0];
String msgToSend = received.split("\\|\\|")[1];
Date newDate = date.parse(time);
Timestamp timestamp = new Timestamp(newDate.getTime());

msgMap.put(timestamp,msgToSend); // Treemap that allows to put messages in order according to timestamp
int k = 0;
String key;


for(String value : msgMap.values()){

key = String.valueOf(k);
k++;
ContentValues keyValueToInsert = new ContentValues();
keyValueToInsert.put("key", "" + key);
keyValueToInsert.put("value", value);


Uri newUri = getContentResolver().insert(
Uri.parse("content://lebanner.provider"), // assume we already created a Uri object with our provider URI
keyValueToInsert
);


}

}


Finally here is my Client Task..



private class ClientTask extends AsyncTask<String, Void, Void> {

@Override
protected Void doInBackground(String... msgs) {

Date currentDate= new Date();
Timestamp time = new Timestamp(currentDate.getTime());
Message temp = new Message(myPort, msgs[0], time);////
try {

for(int i = 0; i <= 2; i++) {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(InetAddress.getByAddress(new byte[]{10, 0, 2, 2}),
Integer.parseInt(REMOTE_PORTS[i])), 1000);
socket.setTcpNoDelay(true);
OutputStream outputStream = socket.getOutputStream();
DataOutputStream o = new DataOutputStream(new BufferedOutputStream(outputStream));

o.writeUTF(msgs[0]);
o.writeUTF(""+time);
o.flush();////
socket.close();
}
}
catch (UnknownHostException e) {
Log.e(TAG, "ClientTask UnknownHostException");
} catch (IOException e) {
Log.e(TAG, "ClientTask socket IOException");
}

return null;
}


Can you find the part causes the problem?




Aucun commentaire:

Enregistrer un commentaire