Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема передачи файлов через сокеты Tserversocket Tclientsocket

13K
28 сентября 2005 года
Cameron
2 / / 28.09.2005
Здраствуйте уважаемые программеры у меня небольшая проблема так как я не опытный программист. Она состоит в следующем.
Я пытаюсь переслать изображение с формы сервера на форму клиента и всегда возникает ошибка EAccesViolation или EConvertError
Вот обработчики события OnClient read Сервера и клиента.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
var
Ms:Tmemorystream;
I:integer;
begin
if socket.ReceiveText='send' then
begin
Ms:=TmemoryStream.Create;
image1.Picture.Grafic.SaveToStream(ms);
i:=ms.Size;
buffer:=ms.Memory; // Здесь возникае ошибка
//EConvertError
//а если написать ms.read(buffer,i); Возникнет EAccesViolation.
socket.SendText(inttostr(i));
socket.SendBuf(buffer^,i);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;

begin
data:=Tmemorystream.Create;
size:=strtoint(socket.ReceiveText);
socket.ReceiveBuf(bufer,size);
data.Write(bufer,size);
image2.Picture.bitmap.LoadFromStream(data);
end;

Помогите объесните как это заставить работать.
Зарание благодарен!!!!!!
4.8K
05 октября 2005 года
xm...
45 / / 20.11.2004
А что, если попробовать в ServerSocket1ClientRead скопировать в buffer функцией CopyMemory?
6.7K
05 октября 2005 года
Metalslave
37 / / 24.08.2004
Цитата:
Originally posted by Cameron
[B
Я пытаюсь переслать изображение с формы сервера на форму клиента и всегда возникает ошибка EAccesViolation или EConvertError
Вот обработчики события OnClient read Сервера и клиента.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
var
Ms:Tmemorystream;
I:integer;
begin
if socket.ReceiveText='send' then
begin
Ms:=TmemoryStream.Create;
image1.Picture.Grafic.SaveToStream(ms);
i:=ms.Size;
buffer:=ms.Memory; // Здесь возникае ошибка
//EConvertError
//а если написать ms.read(buffer,i); Возникнет EAccesViolation.
socket.SendText(inttostr(i));
socket.SendBuf(buffer^,i);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;

begin
data:=Tmemorystream.Create;
size:=strtoint(socket.ReceiveText);
socket.ReceiveBuf(bufer,size);
data.Write(bufer,size);
image2.Picture.bitmap.LoadFromStream(data);
end;


Сразу хочу сказать что в Делфе этот компонент отличаеться глюковатостью.
Дальше что б передать изображение нужно
1.Загрузить его в Tmemorystream - ты это делаешь.
2.Послать клиенту размер этого Tmemorystream - ты это тож делаешь.
3. Послать сам стрим.!!! А ты прицыпился к buffer (ты не указал тип ... так что не знаю) и суешь в него pointer - memory. поэтому - EConvertError
а если EAccesViolation - то этот buffer не создан.(create)
а потом еще и socket.SendBuf(buffer^,i);
а нуно просто Socket.SendStream(ms);
и еще в конце процедуры делай ms.destroy;
Теперь получаем на клиенте...
Тебе нужно знать что прислал тебе сервер ... начало стрима, то есть изображения или продолжает досылать прошлое (никто ж не сказал что тебе за один раз прийдет все!)
Потому читаем
s := socket.ReceiveText
если это первый раз тогда читаем первые байты как размер стрима, запоминаем в DataSize.
теперь все последующиее ClientSocket1Read -
Data.write(s[1], length(s));
if Data.Size = DataSize then изображение переданно
пользуйся.
только убери из ClientSocket1Read - data:=Tmemorystream.Create;

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог