Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2009, 14:18   #1
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию передача jpg-файла с компа на телефон через интернет

и снова здравствуйте.
сейчас у меня задачка посложнее чем передача строки или числа, мне нужно передать
фотку в формате jpg с компа на телефон через интернет.
я решил передавать jpg-файл в виде потока байтов(потому что другого способа я не знаю).
телефон фотку принимает, но она постоянно оказывается поврежденной после приема.
при этом, когда я смотрю свойства фотки, там указаны все правильные параметры:
формат jpg, размер 3,8 Кб, размеры в пикселях.
изначально эта фотка была сделана на моем же телефоне.
телефон у меня Nokia 6151.
эту же фотку я успешно копировал потоком байтов отдельно на компе и отдельно на телефоне,
когда изучал работу с файлами.
помогите пожалуйста разобраться почему файл оказывается поврежденным после передачи.

вот код серверной программы:
Код:
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;

public class mainServer {		
    public static void main(String[] ar) {

		int port = 5555;	
		int modeFigure;
			
		try {
			ServerSocket ss = new ServerSocket(port);
			Socket socket = ss.accept();
			
			InputStream sin = socket.getInputStream();
			OutputStream sout = socket.getOutputStream();

			DataInputStream in = new DataInputStream(sin);
			DataOutputStream out = new DataOutputStream(sout);
			
			modeFigure = in.read();//принимаем от клиента некоторое число
			System.out.println("Chosen mode");
			System.out.println(modeFigure);
					 
			int sizejpg;//переменная для размера фотки в байтах
			// поток для считывания байтов фотки
			InputStream fstream_jpg = new FileInputStream("foto.jpg");
		
			sizejpg = fstream_jpg.available();
			//размер фотки в байтах - 3900
			System.out.println("The length of photo in bytes: " + sizejpg);
			// массив который будет содержать все байты фотки
			// как я понял каждый байт фотки представляет из себя число от 0 до 255
			int[] buf_bytes_jpg = new int[sizejpg];
			
			//закачиваем в массив все числа(байты) фотки
			for (int i=0; i < sizejpg; i++) buf_bytes_jpg[i] = fstream_jpg.read();
		 
			// массив для передачи чисел
			// тип byte потому что метод write() может отправить за раз только массив типа byte
			byte[] buf_mas = new byte[sizejpg];
		 
			// записываем в массив buf_mas каждое число массива buf_bytes_jpg
			// с вычитанием 128 
			 for (int i = 0; i < buf_mas.length; i++) buf_mas[i] = (byte)(buf_bytes_jpg[i] - 128);
			 //т.е. первые три элемента buf_bytes_jpg: 255,216,255
			 //первые три элемента buf_mas:			   127,88,127
			 // все это нужно т.к. диапазон чисел для типа byte [-128,127]
	 
			 out.write(buf_mas);// отправляется сразу весь массив
		 
		} catch(Exception x) {
			x.printStackTrace();
		}	
	}
}
вот фрагмент кода клиентской программы:
Код:
else if (c == createMode2_5) {
            String name = "socket://" + varForIp + ":5555";
            try {
                SocketConnection sc = (SocketConnection)Connector.open(name);

                 OutputStream os = sc.openOutputStream();
                 InputStream is = sc.openInputStream();

                 Form5.append("\nНачало теста, блок try");
                 os.write(modeFigure);//отправляем серверу некоторое число

				 //здесь я решил указать точный размер фотки в байтах
                 byte[] buf_mas = new byte[3900];

                 is.read(buf_mas);//все байты фотки считываются в массив buf_mas

				 //создается объект fc_new_jpg_file для создания файла myFoto.jpg
				 // на флешке моего телефона
                 FileConnection fc_new_jpg_file = (FileConnection)Connector.open("file:///e:/myFoto.jpg");
                 if(!fc_new_jpg_file.exists()) fc_new_jpg_file.create();// создается файл

				 //создается поток os_file для закачивания байтов в созданный файл
                 OutputStream os_file = fc_new_jpg_file.openOutputStream();

				 // вот здесь закачиваются все числа массива buf_mas(с прибавлением 128)
				 // в файл myFoto.jpg
                 for (int i=0; i < buf_mas.length; i++) os_file.write(buf_mas[i]+128);

                 os_file.close();
                 fc_new_jpg_file.close();

				 // здесь я просто проверяю содержимое массива buf_mas
				 // первые 5 чисел такие же как и на сервере
                 Form5.append("\n" + buf_mas[0]);
                 Form5.append("\n" + buf_mas[1]);
                 Form5.append("\n" + buf_mas[2]);
                 Form5.append("\n" + buf_mas[3]);
                 Form5.append("\n" + buf_mas[4]);

            } catch (IOException x){
                  x.printStackTrace();
            }
            Form5.append("\nТест завершен вне блока try");
}
sum42 вне форума Ответить с цитированием
Старый 22.12.2009, 00:46   #2
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию

тема закрыта.
мне подсказали работающий вариант на другом форуме.

мне подкинули эту ссылку:
http://www.rgagnon.com/javadetails/java-0542.html
там правда передача файла на локальном компе,
но я применил код клиента оттуда к моему клиентскому приложению на J2ME.
я сервер я оставил такой же как там.

вот фрагмент кода клиентской программы:

Код:
String name = "socket://" + varForIp + ":5555";

            try {

                SocketConnection sc = 
                (SocketConnection)Connector.open(name);

                InputStream is = sc.openInputStream();

	int filesize=5000;

	int bytesRead;
	int current = 0;

    byte [] mybytearray  = new byte [filesize];

    bytesRead = is.read(mybytearray,0,mybytearray.length);

    current = bytesRead;

    do {
       bytesRead =
          is.read(mybytearray, current, (mybytearray.length-current));
       if(bytesRead >= 0) current += bytesRead;
    } while(bytesRead > -1);



    FileConnection fc_new_jpg_file = (FileConnection)Connector.open("file:///e:/myFoto.jpg");
    if(!fc_new_jpg_file.exists()) fc_new_jpg_file.create();

    OutputStream os_file = fc_new_jpg_file.openOutputStream();

    os_file.write(mybytearray, 0 , current);

            } catch (IOException x){
                  x.printStackTrace();
            }
sum42 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файлов через интернет RIO Работа с сетью в Delphi 7 14.01.2010 13:05
передача строки с телефона на комп через интернет на Java sum42 Общие вопросы по Java, Java SE, Kotlin 13 13.12.2009 19:40
передача скриншота с компа на телефон через интернет sum42 Помощь студентам 3 21.09.2009 14:42
Передача файла через сокет Delphi Unconnected Работа с сетью в Delphi 4 23.12.2008 16:16
Передача файла с одного компа на другой Kocapb Фриланс 4 18.11.2007 18:37