Дополнительные символы, записываемые в файл от клиента к серверу

Я отправляю текст между клиентом и сервером с помощью Java. Это делается путем отправки байтового потока от клиента к серверу. Строка, которая была преобразована из байтового потока, затем сохраняется в папке с меткой времени, посредством чего она записывается в файл. К сожалению, пробелы, а также неожиданные символы, такие как «^ @», записываются в файл вместе с ожидаемым текстом.

В чем может быть проблема? Я думаю, что это может быть ошибка преобразования буфера в строку, но я могу ошибаться.

Я прикрепил вывод времени выполнения из терминала, а также весь полезный код, в котором, как я полагаю, возникает проблема. Объяснение этой проблемы, а не просто ответ было бы наиболее полезным, поскольку я хотел бы узнать, почему возникает такая ошибка.

Основной метод:

public static void main(String[] args) {
  startServer();


  String date = createDateString(); 
  String miniDate = createMiniDateString(); 

  System.out.println("hello, we are still waiting to start...");


  try {
    Socket       connection;
    OutputStream tx;
    InputStream  rx;

    connection = server_.accept(); // waits for connection
    tx = connection.getOutputStream();
    rx = connection.getInputStream();
    server_.close(); // no need to wait now

    System.out.println("We are here now");

    System.out.println("New connection ... " +
        connection.getInetAddress().getHostName() + ":" +
        connection.getPort());

    byte[] buffer = new byte[bufferSize_];
    int b = 0;
    while (b < 1) {
      Thread.sleep(sleepTime_);

      buffer = new byte[bufferSize_];
      b = rx.read(buffer);
    }

    if (b > 0) {

      //I believe the problem might be due to buffer to string conversion
      String s = new String(buffer); //this is the message, we might have to store it in an array instead?
      System.out.println("Received " + b + " bytes --> " + s);

      System.out.println("***** this is the string: *****"+s);

      System.out.println("Sending " + b + " bytes");
      tx.write(buffer, 0, b); // send data back to client

      createDirectory(s, date, miniDate);

      connection.close(); // finished
    }


  }

  catch (SocketTimeoutException e) {
    // no incoming data - just ignore
  }
  catch (InterruptedException e) {
    System.err.println("Interrupted Exception: " + e.getMessage());
  }
  catch (IOException e) {
    System.err.println("IO Exception: " + e.getMessage());
  }
}

Метод createDirectory:

public static void createDirectory(String s, String date, String miniDate){


  String dirName = new String(date);//time1
  String fileName = new String(miniDate); //time2
  String text = new String(s); //message

  File dir = new File(dirName); //copy these raw at first and then clean it up as a new method

  if (dir.exists()) {
    System.out.println("++ File already exists: " + dirName);
    //System.exit(0);
  }

  if (dir.mkdir()) {
    System.out.println("++ Created directory: " + dirName);
  }
  else {
    System.out.println("++ Failed to create directory: " + dirName);
    //System.exit(0);
  }

  fileName = dirName + File.separator + fileName;
  File file = new File(fileName);

  if (file.exists()) {
    System.out.println("++ File already exists: " + fileName);
    //System.exit(0);
  }

  try {
    FileWriter fw = new FileWriter(file);
    fw.write(text);
    fw.flush();
    fw.close();
  }
  catch (IOException e) {
    System.out.println("IOException - write(): " + e.getMessage());
  }

  System.out.println("++ Wrote \"" + text + "\" to file: " + fileName);

}

Вывод в файл

Клиентские коммуникации

Вывод терминала на стороне сервера

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
33
1

Ответы 1

Вы пытаетесь преобразовать в String весь буфер (все байты bufferSize_), но только первые байты b буфера содержат данные, полученные от клиента. Использовать

String s = new String(buffer, 0, b);

для преобразования только первых байтов b байтового массива (см. этот отвечать)

Другие вопросы по теме