【问题标题】:Android TCP multicast missing messageAndroid TCP 多播丢失消息
【发布时间】:2015-05-07 15:51:59
【问题描述】:

我使用 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;
    }

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

【问题讨论】:

  • 我不得不使用 TCP,因为这是我从学校得到的作业......
  • 这里不是在做多播,而是在做多目标的点对点 TCP。

标签: java android tcp android-asynctask


【解决方案1】:

排序/排队/确认所有这些事情都是 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

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

我希望这会有所帮助。

【讨论】:

  • 你认为我必须为 servertask 实现诸如保留队列之类的东西,以防止跳过接收一些消息吗?
  • 没有没有。如果您使用 TCP,则这些都不是必需的。我宁愿将它们放在列表视图中,而不是在文本视图中输入消息。这样,您就不会丢失任何消息,并且可以滚动浏览它们。
  • 我对消息进行排序和排队的原因是因为这个应用程序不仅仅用于 1:1 通信。每个设备都会收到来自其他设备的消息。
【解决方案2】:

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

如果你想创建一个多播应用程序,你应该使用multicastsocket

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多