Форум программистов, компьютерный форум, киберфорум
Java ME (J2ME)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/20: Рейтинг темы: голосов - 20, средняя оценка - 4.80
3 / 3 / 2
Регистрация: 15.11.2008
Сообщений: 22
1

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

15.12.2009, 14:19. Просмотров 4094. Ответов 1
Метки нет (Все метки)

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

вот код серверной программы:
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
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();
        }   
    }
}
вот фрагмент кода клиентской программы:
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
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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2009, 14:19
Ответы с готовыми решениями:

Передача файла через интернет
Задача: передать файл клиенту от сервера, целиком, т.е. отправка самого файла, а не чтение его с...

Передача файла через интернет TCP/IP
Здравствуйте. Проблема следующая: есть клиент (с++) который посылает по частями видео на сервер...

Раздача инета через Wi-Fi с компа на телефон
Есть W7 максим. на нем настроенно ADSL подключение (модем соединен с ПК через лан порт, в...

Выход в Интернет через телефон
Всем привет! Возникла вот какая проблема - нет возможности подключить телефон к интернету дабы...

1
3 / 3 / 2
Регистрация: 15.11.2008
Сообщений: 22
22.12.2009, 00:44  [ТС] 2
тема закрыта.
мне подсказали работающий вариант на другом форуме.

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

вот фрагмент кода клиентской программы:
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
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();
            }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2009, 00:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Интернет через мобильный телефон.
Привет всем. Помогите пожалуйста с настройкой интернета, используя мобильный телефон как модем....

Интернет через мобильный телефон
Народ подскажите пожалуста, как на Винду 7 (домашняя расширенная) подключить мобильный телефон...

Передача файлов на телефон через COM порт
Помогите пожалуста понять как можно осуществить передачу файлов на мобильный телефон через АТ...

Интернет на 2 компа через сеть
ВСемм привет. Прошу обратить внимание на мою проблему. Проблема такова: Решил попробовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.