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

sum44

Member
29.10.2008
23
0
#1
здравствуйте.
мне нужно передать фотку в формате 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");
}