Делаю робота на основе мобильно телефона (Nokia 5530). Компьютер будет в роли сервера. Обмен данными производится через вайфай. Под телефон пишу на JavaME. Написал первое приложение для обмена сообщениями с телефона на комп и обратно, все работает на ура. Программа-сервер ПОКА написана на Делфи. Перешел ко второму этапу разработки ПО для телефона. Нужно передавать кадры с камеры на комп через вайфай 2 раза в секунду. И тут начался кошмар, с JavaME знаком только пару недель. Я пока пытаюсь отослать 1 кадр на комп. И проблема в том что кадр удается получить, даже отправляет, но когда я пытаюсь сохранить полученный кадр, то открыть эту картинку для просмотра не получается, говорит что файл поврежден. Ниже код отправки этого самого кадра
- Код: Выделить всё • Развернуть
public void SendIm()
{
try
{
System.out.println("Get snapshot");
byte[] raw = videoControl.getSnapshot("encoding=png"); // получаем png картинку с камеры
int size;
size = raw.length; // получаем ее размер
String s;
s = "file"+Integer.toString(size)+"/"; // сообщение о том что это файл и его размер
byte[] d = s.getBytes(); // переводим s в массив байт
System.out.println(s);
try
{
outputStream.write(d); // отправляем на сервер размер файла
outputStream.flush();
dataOutputStream.write(raw);// отправляем на сервер сам файл
dataOutputStream.flush();
}catch(IOException ioe){}
}catch(MediaException me){}
}
На делфи прием файла сделан так:
- Код: Выделить всё • Развернуть
rocedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
const
MAX_BUF_SIZE = $4095; //Константа буффера
var
sd:integer;
buf: TByteArr;
b: array [0..1] of byte;
str:string;
I,c: integer;
S,RText: String;
Letra: char;
MemoryStream: TMemoryStream; //Переменная потока памяти
Buffer: array [0..MAX_BUF_SIZE] of Char; //Переменная буффера
pc: PChar;
begin
Timer1.Enabled := true;
RText := Socket.ReceiveText;
if Receive=true then // если сервер в режиме приема файла
begin
Writing(RText); // принимаем файл
end
else
begin
if copy(RText, 1,4)='file' then // если первое слово в пришедшем пакете file то переводим сервер в режим приема
begin
MS := TMemoryStream.Create();
Delete(RText,1,4); // удаляем из сообщения file
size := StrToInt(copy(RText,1,pos('/',RText)-1)); // получаем размер файла
Delete(RText,1,POS('/',RText));
Receive := true; // переводим серевер в режим приема
if RText <>'' then
Writing(RText); // принимаем файл
end;
end;
procedure TForm1.Writing(TextS: string);
begin
if MS.Size < size then // если размер буфера меньше размера файла
begin
MS.Write(Texts,Length(Texts)); // пишем в память принятый кусок файла
// sMemo1.Lines.Add('Write');
sProgressBar1.Position := MS.Size*100 div size;
sStatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
end;
if MS.Size = size then // если приняли все то
begin
Receive := true;
MS.Position := 0;
MS.SaveToFile('C:\Stream.png'); сохраняем файл на диск
// Image4.Picture.Bitmap.LoadFromStream(MS);
// sMemo1.Lines.LoadFromStream(ms);
MS.Free;
sStatusBar1.SimpleText := 'Файл принят';
end;
end;
И тут проблема, файл в конце оказывается битым. Подскажите что тут не так. Где ошибка.