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();
}
}
Я, наконец, пересмотрел свой исходный код и понял, что код на самом деле функциональный, т.е. Хороший. Можно было бы внести несколько корректировок, чтобы сделать его немного красивее и улучшить логику. Например, я переместил некоторые объявления переменных из бесконечного цикла while...
Ответы на мои вопросы довольно просты:
arrayPartialSum[recvdProcessID] = recvdPartialSum;
фактически делает то, что он должен делать. То есть хранить каждую полученную частичную сумму в массиве частичных сумм по индексу, соответствующему его идентификатору процесса. Проблема в логике на самом деле не в коде, а скорее в том, как я, как пользователь программы, запускал процессы. Мне нужно убедиться, что я ударил ответ в каждом процессе, чтобы отправить его частичную сумму в группу многоадресной рассылки. Чтобы получить индекс данного элемента, приведенный ниже код выполняет задание, maximumSum
является элементом, индекс которого пытается найти в массиве arrayPartialSum
:
for (int i = 0; i < arrayPartialSum.length; i++) {
if (arrayPartialSum[i] == maximumSum) {
retval = i;
break;
}
}