Некоторые общие комментарии к вашему коду:
int bytesRead=0;
int bytesToRead=25;
byte[] input = new byte[bytesToRead];
while (bytesRead < bytesToRead) {
int result = in.read(input, bytesRead, bytesToRead - bytesRead);
if (result == -1) break;
bytesRead += result;
}
Эта обработка EOF является обманчивой.Это означает, что вы не знаете, действительно ли вы прочитали полные 25 байтов.И если вы этого не сделаете, вы предположите, что число байтов для отправки равно 0.
Хуже, вы копируете и вставляете этот код ниже, полагаясь на правильную инициализацию тех же переменных.Если есть опечатка, вы никогда не будете знать это.Вы можете преобразовать его в свой собственный метод ( с тестами ), или вы можете вызвать DataInputStream.readFully()
.
inputLine = getHexString(input);
String hexLength = inputLine.substring(46, 50);
Вы конвертируете в гекс, чтобы извлечь целое число?Зачем?И что еще более важно, если у вас есть какие-либо проблемы с порядком байтов, это, вероятно, причина
Я изначально собирался рекомендовать использовать ByteBuffer
для извлечения значений, но на второй взгляд я думаю, что выследует обернуть ваш входной поток с DataInputStream
.Это позволило бы вам читать полные буферы byte[]
без необходимости в цикле, и это позволило бы вам избавиться от преобразований байтов в шестнадцатеричные числа: вы просто вызывали бы readInt()
.
Но, продолжая:
String[] dataArray = new String[10];
dataArray = dataValues.dataArray();
Вы понимаете, что new String[10]
выбрасывается на следующей строке?Это то, что вы хотите?
int towrite = Integer.parseInt(dataArray[0].trim());
datOut.writeInt(towrite);
System.out.println("Returned number of records: " + Integer.parseInt(dataArray[0].trim()) );
Если вы используете операторы логирования, выведите то, что вы на самом деле используете (towrite
).Не пересчитывайте это.Слишком велика вероятность ошибиться.
} catch (Exception ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
// ...
} catch (IOException e) {
e.printStackTrace();
}
Вызывается ли один или оба из этих блоков улова?И почему они отправляют свою продукцию в разные места?В этом отношении, если у вас есть регистратор, почему вы вставляете операторы System.out.println()
?