S
sum44
здравствуйте.
мне нужно передать фотку в формате jpg с компа на телефон через интернет.
я решил передавать jpg-файл в виде потока байтов(потому что другого способа я не знаю).
телефон фотку принимает, но она постоянно оказывается поврежденной после приема.
при этом, когда я смотрю свойства фотки, там указаны все правильные параметры:
формат jpg, размер 3,8 Кб, размеры в пикселях.
изначально эта фотка была сделана на моем же телефоне.
телефон у меня Nokia 6151.
эту же фотку я успешно копировал потоком байтов отдельно на компе и отдельно на телефоне,
когда изучал работу с файлами.
помогите пожалуйста разобраться почему файл оказывается поврежденным после передачи.
вот код серверной программы:
вот фрагмент кода клиентской программы:
мне нужно передать фотку в формате 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");
}