Потоковый ArrayList POJO с использованием FasterXML - PullRequest
0 голосов
/ 21 ноября 2018

Я сейчас разрабатываю приложение наподобие Napster.У меня есть два статических метода, которые я использую для отправки информации между клиентом и центральным сервером.При любом подключении клиента поток на сервере принимает входящее соединение, и после подключения клиентское приложение отправляет свои пользовательские данные и список файлов, описанных в параметре ArrayList, передаваемых в эту функцию:

/**
 * Send an ArrayList of FileInfo objects to a socket.
 * @param fout Output BufferedWriter
 * @param fileInfoArrayList ArrayList of FileInfo objects to send
 */
public static void sendFileInfoArrayList(BufferedWriter fout, ArrayList<FileInfo> fileInfoArrayList) {
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
        objectMapper.writeValue(fout, fileInfoArrayList);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Поток сервераиспользует аналогичный метод для получения информации о недавно подключенном клиенте:

/**
 * Receive an ArrayList of FileInfo objects from a socket.
 * @param fin Input BufferedReader
 * @return ArrayList of FileInfo objects received
 */
public static ArrayList<FileInfo> recvFileInfoArrayList(BufferedReader fin) {
    ArrayList<FileInfo> fileInfoArrayList = new ArrayList<>();
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
        CollectionType javaType = objectMapper.getTypeFactory()
                .constructCollectionType(ArrayList.class, FileInfo.class);
        fileInfoArrayList = objectMapper.readValue(fin, javaType);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fileInfoArrayList;
}

Следующим шагом является то, что центральный серверный поток входит в цикл при условии, что соединение сокетов ожидает получения условия поиска отклиент.Я собирался просто использовать BufferedReader.readLine() на сервере и отправить поисковый запрос java.lang.String (с добавленным CRLF), используя DataOutputStream.writeBytes().

Однако, когда он входит в цикл (после первоначального обменаuser / fileinfo (что успешно)) readLine() просто продолжает читать null снова и снова.Я не уверен, почему это так.Мне нужно, чтобы соединение между клиентом и центральным сервером было постоянным, поэтому objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false), поэтому закрывать его нельзя.Я попытался flush() записать в моем статическом методе отправки выше, shutdownOutput() на выходе socket.Я не могу определить причину проблемы, с которой я столкнулся.

...