1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

передача Jpg-файла с компа на телефон через интернет

Тема в разделе "Java", создана пользователем sum44, 15 дек 2009.

  1. sum44

    sum44 Member

    Репутация:
    0
    Регистрация:
    29 окт 2008
    Сообщения:
    23
    Симпатии:
    0
    здравствуйте.
    мне нужно передать фотку в формате 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");
    }
     
  2. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
  3. sum44

    sum44 Member

    Репутация:
    0
    Регистрация:
    29 окт 2008
    Сообщения:
    23
    Симпатии:
    0
Загрузка...

Поделиться этой страницей