Проблема загрузки слушателя сокета Java - PullRequest
2 голосов
/ 30 января 2010

Я сделал слушатель сокета в Java, который прослушивает данные на двух портах и ​​выполняет операции с прослушиваемыми данными. Теперь сценарий таков, что когда и прослушиватель, и устройство, которое передает данные, работают и работают, слушатель получает данные, по одному за раз (каждые данные начинаются с «#S» и заканчиваются «.») И когда прослушиватель не подключен или не прослушивает, устройство сохраняет данные в своей локальной памяти и, как только прослушиватель подключается, отправляет все данные в прилагаемой форме, например:

"#S ...DATA...[.]#S...DATA...[.]..."

Теперь я реализовал это таким образом, что, какие бы данные ни слушал ни получал на любом из портов, он конвертируется в шестнадцатеричную форму, а затем выполняет операции с шестнадцатеричным форматом входных данных. Шестнадцатеричная форма "#S "это" 2353 "и шестнадцатеричная форма". " это "2e". Код для обработки шестнадцатеричной формы входных данных выглядит следующим образом. hexconverted1 - это строка, содержащая преобразованную в шестнадцатеричном виде форму всех входных данных, которая поступает на любой порт.

String store[];
store=hexconverted1.split("2353"); 
for(int m=0;m<store.length;m++)
    store[m]="2353"+store[m];

 PrintWriter out2 = new PrintWriter(new BufferedWriter(new FileWriter("C:/Listener/array.bin", true)));
    for(int iter=0;iter<store.length; iter++)
        out2.println(store[iter]);
    out2.close();

То, что я пытаюсь выполнить с помощью приведенного выше кода, заключается в том, что всякий раз, когда поступает куча данных, я пытаюсь сканировать данные и просеивать все данные из этой пачки и сохранять их в строковом массиве, чтобы операции, которые я хочу выполнить в шестнадцатеричной форме данных, могут быть выполнены более простым способом. Поэтому, когда я записываю содержимое массива в файл BIN, выходные данные различаются для одного и того же ввода. Когда я отправляю сгруппированные данные из 280 пакетов данных, добавляемых один за другим, иногда массив содержит 180, а иногда 270. Но для меньших размеров я получаю желаемые результаты, и размер массива 'store' равен также, как и ожидалось.

Я совершенно не понимаю, что происходит, и любые указатели будут очень полезны.

Для большей ясности данные, которые я получаю через порты, в основном не читаются, и часто единственными читаемыми частями являются начальные биты "#S" и конечный бит ".". Поэтому я использую комбинацию BufferedInputStream и InputStream, чтобы прочитать входящие данные и преобразовать их в шестнадцатеричный формат, и я совершенно уверен, что преобразование в шестнадцатеричное происходит хорошо.

1 Ответ

0 голосов
/ 30 января 2010

я использую комбинацию BufferedInputStream и InputStream для чтения входящих данных

Держась за соломинку здесь. Если вы читаете из потока, используя методы InputStream и BufferedInputStream, вы столкнетесь с трудностями:

InputStream is = ...
BufferedInputStream bis = new BufferedInputStream(is);

// This is OK
int b = bis.read();
...
// Reading the InputStream directly at this point is liable to
// give unpredictable results.  It is likely that some bytes still
// remain in "bis"'s buffer, and a read on "is" will not return them.
int b2 = is.read();
...