Я сейчас разрабатываю приложение наподобие 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
.Я не могу определить причину проблемы, с которой я столкнулся.