Как я могу убедиться, что все пакеты были получены и сохранены в массиве?

1

1) В Java Connectionless Socket Programming, как я могу убедиться, что все пакеты из моих 5 процессоров получены и хранятся в массиве по мере их поступления? В принципе, я хочу собрать все частичные суммы, которые отправляются всеми процессами (5 из них), которые являются частью группы многоадресной рассылки, и хранить эти частичные суммы в массиве, на котором я буду выполнять несколько операций.

2) Кроме того, я хотел бы получить идеи о том, как найти индекс данного элемента массива целых чисел в этом же коде. Одна из операций, которую мне нужно выполнить, - найти Max моего массива и получить его индекс.

Ниже приведен фрагмент моего кода потока, который имеет методы приема.

readThread(InetAddress g, int port){

    group = g;
    multicastPort = port;
}

public void run(){

    try {
        MulticastSocket readSocket = new MulticastSocket(multicastPort);
        readSocket.joinGroup(group);

        while (true) {
            byte[] recvBuffer = new byte[MAX_MSG_LEN];
            DatagramPacket packet = new DatagramPacket(recvBuffer, recvBuffer.length, group, multicastPort);

            readSocket.receive(packet);

            String rString = new String(packet.getData());
            String message = new String(rString.getBytes()).trim();                             // Process the received message before use here

            StringTokenizer stk = new StringTokenizer(message, ",");

            int recvdProcessID = Integer.parseInt(stk.nextToken());
            int recvdPartialSum = Integer.parseInt(stk.nextToken());

            System.out.println("\n"+recvdProcessID+" "+recvdPartialSum);

            int[] arrayPartialSum = new int[multicastSenderReceiver.numProcesses];              // array to store partial sums

            /* Store each received partial sum in an array of partial 
             sums at index corresponding to the respective */

            arrayPartialSum[recvdProcessID] = recvdPartialSum;

            // For debug, here is another way of listing the elements of the array of partial sums.
            System.out.println("\nHere is the array of partial sums: ");
            for (int element: arrayPartialSum){
                System.out.println("\n"+element);
            }

            // Compute and Display the sum of all the partial sums:
            int grandTotal = 0;
            for (int s: arrayPartialSum) {
                grandTotal += s;
            }
            System.out.println("\nGrand Total: "+grandTotal);

            /*Finding the maximum value in the array of partial sums */
            int maximumSum = 0;
            maximumSum = maximum.Max(arrayPartialSum);
            System.out.println("The Maximum of all partial sums is"+maximumSum);
        }

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
}

UPDATE: я переместил несколько элементов из цикла while (true), но теперь у меня есть новый тип ошибки при компиляции. Он показывает определенные строки и говорит "Недостижимое утверждение". Есть идеи?

public void run(){

    try {
        MulticastSocket readSocket = new MulticastSocket(multicastPort);
        readSocket.joinGroup(group);
        int[] arrayPartialSum = new int[multicastSenderReceiver.numProcesses];              // array to store partial sums
        int grandTotal = 0;

        while (true) {
            byte[] recvBuffer = new byte[MAX_MSG_LEN];
            DatagramPacket packet = new DatagramPacket(recvBuffer, recvBuffer.length, group, multicastPort);

            readSocket.receive(packet);

            String rString = new String(packet.getData());
            String message = new String(rString.getBytes()).trim();                             // Process the received message before use here

            StringTokenizer stk = new StringTokenizer(message, ",");

            int recvdProcessID = Integer.parseInt(stk.nextToken());
            int recvdPartialSum = Integer.parseInt(stk.nextToken());

            System.out.println("\n"+recvdProcessID+" "+recvdPartialSum);

            /* Store each received partial sum in an array of partial 
             sums at index corresponding to the respective */
            arrayPartialSum[recvdProcessID] = recvdPartialSum;
        }

        // Compute and Display the sum of all the partial sums:
        for (int s: arrayPartialSum) {
            grandTotal += s;
        }
        System.out.println("\nGrand Total: "+grandTotal);

        /*Finding the maximum value in the array of partial sums */
        int maximumSum = 0;
        maximumSum = maximum.Max(arrayPartialSum);
        System.out.println("The Maximum of all partial sums is"+maximumSum);

        // For debug, here is another way of listing the elements of the array of partial sums.
        System.out.println("\nHere is the array of partial sums: ");
        for (int element: arrayPartialSum){
            System.out.println("\n"+element);
        }

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
Теги:
arrays
sockets
multicast

1 ответ

0
Лучший ответ

Я, наконец, пересмотрел свой исходный код и понял, что код на самом деле функциональный, т.е. Хороший. Можно было бы внести несколько корректировок, чтобы сделать его немного красивее и улучшить логику. Например, я переместил некоторые объявления переменных из бесконечного цикла while...

Ответы на мои вопросы довольно просты:

  1. Строка arrayPartialSum[recvdProcessID] = recvdPartialSum; фактически делает то, что он должен делать. То есть хранить каждую полученную частичную сумму в массиве частичных сумм по индексу, соответствующему его идентификатору процесса. Проблема в логике на самом деле не в коде, а скорее в том, как я, как пользователь программы, запускал процессы. Мне нужно убедиться, что я ударил ответ в каждом процессе, чтобы отправить его частичную сумму в группу многоадресной рассылки.
  2. Чтобы получить индекс данного элемента, приведенный ниже код выполняет задание, maximumSum является элементом, индекс которого пытается найти в массиве arrayPartialSum:

    for (int i = 0; i < arrayPartialSum.length; i++) {
        if (arrayPartialSum[i] == maximumSum) {
            retval = i;
            break;
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню