Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка в передача файла по сети в цикле по готовности / 4 сообщений из 4, страница 1 из 1
17.01.2012, 11:30:33
    #37617620
Mikle_kk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в передача файла по сети в цикле по готовности
Сервер подготавливает файлы в классе DataManager. Когда файл готов глобальная переменная этого класса выставляется в true. Основываясь на этот флажок начинается пересылка этого файла клиенту.
Клиент ждет от сервера сообщения "ready", которое сообщает о начале пересылки файла.

Если убрать циклы, то единожды файл пересылается нормально. Но когда код обрамлен в циклы клиент зависает в этой части кода:

Код: java
1.
2.
3.
4.
5.
6.
7.
while (read != -1)
{						
    System.out.println(read);
    bos.write(buffer, 0, read);								
    read = bis.read(buffer);
								
}



LogCat показывает, что мы единожды прошли до приведенной выше части кода, потом выводит всё время System.out.println(read); и всё. Там он и сидит.

Как пофиксить, подскажите пожалуйста!

Вот код сервера:

Это метод пересылки файла:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
public void sendImage(String path)
    {

        File file = new File(path);

        try
        {
            bis = new BufferedInputStream(new FileInputStream(file));
            bos = new BufferedOutputStream(fromClientSocket.getOutputStream());
        } catch (IOException ex)
        {
            System.out.println("Ошибка при создании BufferedStream'ов ");
            ex.getMessage();
        }

        byte[] buffer = new byte[4096];

        System.out.println("Sending file");

        try
        {
            out.writeUTF("ready");
            out.flush();

            int read = bis.read(buffer);
            while (read != -1)
            {
                System.out.println(read);
                bos.write(buffer, 0, read);
                read = bis.read(buffer);
            }
            

            bos.flush();


        } catch (IOException e)
        {
            System.out.println("Ошибка при передаче файла");
            e.getMessage();
        }

        System.out.println("Отправили файл успешно");

    }



Это его вызов в мэйне:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
boolean gg = true;
while (gg)
{
    if (DataManager.ready)
    {
        dwc.sendImage(DataManager.p);
        //gg = false;
        DataManager.ready = false;
    }
}




Код клиента:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
while (!stop)
{
try
{
	message = dataInputStream.readUTF();
} catch (IOException e1)
{
	e1.getMessage();
}
					
System.out.println(message);

if (message.equals("ready"))
{
	try 
	{
		i++;
		
		System.out.println("Прошел " + i + " раз");

		String path = Environment.getExternalStorageDirectory().toString()
									+ "/image" + i + ".jpg";
		File file = new File(path);
							
		System.out.println(path);

		bis = new BufferedInputStream(socket.getInputStream());
		bos = new BufferedOutputStream(new FileOutputStream(file));

		byte[] buffer = new byte[4096];

		System.out.println("Начинаю получать файл");
							
							
		int read = bis.read(buffer);
							
							
		while (read != -1)
		{						
			System.out.println(read);
			bos.write(buffer, 0, read);								
			read = bis.read(buffer);
							
		}
							

		System.out.println("file " + i + " is copyed");
							

		System.out.println("After call setImage(1)");
		bos.flush();
							
	}
	catch (IOException e)
	{
		e.getMessage();
		System.out.println("Ошибка при передаче файла");
	}
						
	message = "";

}
...
Рейтинг: 0 / 0
17.01.2012, 11:50:54
    #37617680
Mikle_kk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в передача файла по сети в цикле по готовности
Для наглядности выкладываю скриншоты LogCat'а клиента и логи сервера:

Клиент:
http://imglink.ru/show-image.php?id=b083474c91f430fe29e5685696a0d6b1

Сервер:
http://imglink.ru/show-image.php?id=e0844d99bce028bf83f4fe0a5747cb85
...
Рейтинг: 0 / 0
17.01.2012, 12:23:15
    #37617753
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в передача файла по сети в цикле по готовности
Mikle_kk,

Клиент:
Код: java
1.
2.
3.
4.
5.
6.
while (read != -1)
{						
	System.out.println(read);
	bos.write(buffer, 0, read);								
	read = bis.read(buffer);
}


Не будет здесь -1 никогда(если не закроешь сокет), все 'ready' и файлы пишет в bis. лучше передавать размер файла, чтобы в цикле считать нужное кол-во байтов и выйти из него, те
readUTF() -> i=readInt() -> while(i>0){reab(buffer) i-read}
...
Рейтинг: 0 / 0
17.01.2012, 13:45:09
    #37617927
Mikle_kk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в передача файла по сети в цикле по готовности
0FD
Спасибо огромнейшее. Очень и очень выручили! Всё заработало!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Ошибка в передача файла по сети в цикле по готовности / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]