У меня есть Java-код, который SOMETIMES зависает, когда я его запускаю. Это команда put, которая пропускает через сокеты (и поток ввода и т. Д. Файл с сервера на клиент).Иногда это работает, но иногда это не так, и я получаю сообщение об ошибке.Я перепробовал все возможные пути, которые могут быть приняты с помощью отладки, и я никогда не могу заставить его зависать.Есть ли способ проверить вещь, когда она зависает через eclipse? `
if (sentence.length() > 3 && sentence.substring(0, 3).equals("put")) {
File checkFile = new File(dir.getCurrentPath(), sentence.substring(4));
if (checkFile.isFile() && checkFile.exists()) {
try {
outToServer.writeBytes(sentence + "\n");
boolean cont = false;
String x;
while (!cont) {
if ((x = inFromServer.readLine()).equals("continue")) {
cont = true;
}
}
String name = sentence.substring(4);
copy.copyFile(name);
// outToServer.writeBytes("continue" + "\n");
это клиентский код, который получает запрос PUT (т.е. put test.txt берет файл test.txt и помещает его влокальный каталог сервера.
Копировать файл: (вещь, которая копирует данные)
File checkFile = new File(dir.getCurrentPath(), file);
if (checkFile.isFile() && checkFile.exists()) {
DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream());
// byte[] receivedData = new byte[8192];
File inputFile = new File(dir.getCurrentPath(), file);
byte[] receivedData = new byte[(int) inputFile.length()];
// String theLength = "" + inputFile.length();
outToClient.writeBytes("" + inputFile.length() + "\n");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(getCopyPath(file)));
// if (extension.equals("")) {
// extension = "txt";
// }
// BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// boolean cont = false;
// while (!cont) {
// if (inFromClient.readLine().equals("continue")) {
// cont = true;
//
// }
// }
// outToClient.writeBytes("continue" + "\n");
bis.read(receivedData, 0, receivedData.length);
OutputStream os = socket.getOutputStream();
os.write(receivedData, 0, receivedData.length);
// outToClient.writeBytes("finish" + "\n");
os.flush();
Протокол на сервере (копирует содержимое в файл)
if (get.equals("put")) {
//so the client sends: the put request
//then sends the length
try {
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream());
outToClient.writeBytes("continue" + "\n");
int length = Integer.parseInt(inFromClient.readLine());
// String x = "";
// boolean cont = false;
// while (!cont) {
// String temp = inFromClient.readLine();
// if (temp.equals("finish")) {
// cont = true;
// }
// else {
// x += temp;
// }
// }
byte[] recieveFile = new byte[length];
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream("Copy " + input.substring(4));
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead;
int current = 0;
bytesRead = is.read(recieveFile, 0, recieveFile.length);
current = bytesRead;
Если вы не можете ответить на конкретный вопрос, просто скажите мне, как я могу отлаживать зависающий код или как отлаживать параллельный код (кстати, передача сигналов осуществляется путем передачи токена, как вы можете видеть, т.е.сервер отправляет токен продолжения, который говорит клиенту начать отправку данных, я не сделал этого с помощью потоковых методов, уведомляющих и ожидающих, поскольку я не могу использовать, поскольку у любого отдельного объекта есть только 1 метод.