Android TCP多播丢失消息

时间:2015-03-06 03:51:30

标签: java android tcp android-asynctask

我使用asynctask构建TCP多播聊天应用程序。 我也试图以FIFO和因果顺序排序消息。

但是,当我尝试同时发送大量消息进行测试时,它会遗漏一些消息,但我找不到原因。 我尽我所能努力提高程序的性能,因为我认为性能可能是原因。但仍有同样的问题。 我附上了我的代码的一些重要部分。 最重要的是,

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

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

...

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

你能找到导致问题的部分吗?

2 个答案:

答案 0 :(得分:0)

排序/排队/确认所有这些都是TCP的一部分,因此它由协议本身完成,因此您不需要从代码中明确地完成所有这些操作。您的代码中仍有一些部分可以改进。喜欢:

    String time = received.split("\\|\\|")[0];
String msgToSend = received.split("\\|\\|")[1];
//Instead of doing this, its better to do this: 
String peices[]=received.split("\\|\\|");
String msgToSend=peices[1];
String time=peices[0]

此外,您可以检查是否收到所有原始邮件,如果它在解析过程中使用日志丢失了邮件:

    Log.d("RAW_MESSAGE","Message Received: "+temp); //in your doInBackground

如果您收到了在此日志中发送的所有消息,则协议或发送/接收过程没有任何问题,而是在处理消息时出现问题。此外,对于这些类型的用例,请尝试使用Service组件而不是AsyncTask。

我希望这会有所帮助。

答案 1 :(得分:0)

首先,多播是通过UDP而不是TCP。

如果您想创建多播应用程序,则应使用multicastsocket

http://developer.android.com/reference/java/net/MulticastSocket.html