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

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

  1. sum44

    sum44 Member

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

    вот код серверной программы:
    Код (Text):
    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();
    }  
    }
    }
    вот фрагмент кода клиентской программы:
    Код (Text):
    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

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

    sum44 Member

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

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