Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.08.2007, 10:32   #1
PLOT_HD
 
Регистрация: 08.08.2007
Сообщений: 4
Стрелка Проблема с TClientSocket, TServerSocket

Есть переменная типа
Код:
b : TBitmap
при подключении клиента сервер должен эту картинку отправить. Для этого переменную b я записал в поток вот так :
Код:
var
s : TMemorystream;
begin
s:=tmemorystream.Create;
b.SaveToStream(s);
s.Position:=0;
server.Socket.SendStream(s);

end;
Вопрос как извлечь картинку на клиентской стороне?
Т.Е. что писать здесь :
Код:
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
   //Подскажите кто знает плз...
end;

Последний раз редактировалось PLOT_HD; 11.08.2007 в 10:37.
PLOT_HD вне форума
Старый 11.08.2007, 12:28   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Сервер
TFileStream* str = new TFileStream("M:\\MyFile.jpg",fmOpen Read);
//ИЛИ, если мы работаем без сохранения (тогда не создается файл)
TMemoryStream* str = new TMemoryStream ();
str->Position = 0;
Image1->Picture->Bitmap->SaveToStream(str);
//и, наконец, шлем на сервер битмап
str->Position = 0;
ClientSocket1->Socket->SendStream(str);

Клиент
int ibLen = ServerSocket1->Socket->ReceiveLength();
char* buf= new char[ibLen+1];
TMemoryStream* str = new TMemoryStream();
str->Position = 0;
ServerSocket1->Socket->ReceiveBuf((void*)buf,ibLen);
str->WriteBuffer((void*)buf,ibLen);
str->Position = 0;
Image1->Picture->Bitmap->LoadFromStream(str);
//или
str->SaveToFile("M:\\MyFile.jpg");
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума
Старый 11.08.2007, 12:43   #3
Master-Skull
Пользователь
 
Регистрация: 10.08.2007
Сообщений: 43
По умолчанию

это ты из ФАКа скопировал, где на Борланд сях писанно...
Если не ошибаюсь, надо принимать примерно так:
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 Len: integer;
 St: TMemoryStream;
 Buf: Pointer;
 b: TBitmap;
begin
b:=TBitmap.Create;
Len:=Socket.ReceiveLength;
GetMem(Buf, Len+1);
St:=TMemoryStream.Create;
St.Position:=0;
Socket.ReceiveBuf(Buf, Len);
St.WriteBuffer(buf, Len);
St.Position:=0;
b.LoadFromStream(st);
//Что-то вытворяешь с битмапом
st.Free;
b.Free;
FreeMem(Buf);
end;
Комьютер не поддаётся законам физики:
Глюки появляются из неоткуда, файлы пропадают в никуда...
Объём диска называется весом и измеряется в метрах...

---------------------------------------------------
Дрова для модема находятся на диске, а дрова для дисковода - в интернете...
Master-Skull вне форума
Старый 11.08.2007, 15:39   #4
PLOT_HD
 
Регистрация: 08.08.2007
Сообщений: 4
По умолчанию

Переписал исходник чтобы ни кто не думал что я за ним к Borland'u ходил..
А косяк никуда не делся
Пожалуйста помогите разобраться. Пробовал тоже самое со строками
все нормально работает, а вот для Bitmapa моя квалификация явно не
дотягивает. Мой Х..ен его знает СЕРВЕР :
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
st : TMemoryStream;
begin
  if socket.ReceiveText = 'Get_Bitmap' then//Проверяю команду
  try
    st := TmemoryStream.Create;//Создаю поток
    st.Position := 0;
    Image1.Picture.Bitmap.SaveToStream(st);//Сохраняю Bitmap в поток
    st.Position := 0;
    ServerSocket1.Socket.SendStream(st);//Пробую отправить
  finally
  end;
end;
И еще более х... КЛИЕНТ :

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Active:=true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
 ClientSocket1.Socket.SendText('Get_Bitmap') ;
end;


//Далее у меня косяк

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
 Len: integer;
 St: TMemoryStream;
 Buf: Pointer;

begin
  Len:=Socket.ReceiveLength;
  GetMem(Buf, Len+1);
  St:=TMemoryStream.Create;
  St.Position:=0;
  ClientSocket1.Socket.ReceiveBuf(Buf, Len);
  St.WriteBuffer(buf, Len);
  St.Position:=0;
  Image1.Picture.Bitmap.LoadFromStream(st);
  st.Free;
  FreeMem(Buf);
end;

end;
Очень надо сделать, иначе бы не спрашивал.
Как бы там не было, все равно всем спасибо.
PLOT_HD вне форума
Старый 11.08.2007, 17:03   #5
Master-Skull
Пользователь
 
Регистрация: 10.08.2007
Сообщений: 43
По умолчанию

Так тебе с сервера передавать, а клиенут принимать, так что ли?
Ща пойду поиграюсь с виртуалкой через сеть, если что выйдет, напишу
Кстати,
Цитата:
if socket.ReceiveText = 'Get_Bitmap' then//Проверяю команду
try
st := TmemoryStream.Create;//Создаю поток
в принятом и поток и текст? Помоему надо сначала при Get_Bitmap какую-нить переменную выставлять в true, а после передачи менять на false. А при ломлении проверять если не Get_Bitmap и переменная не true то послать передающего.
PS Сокеты обязательны? Я люблю всё передавать либо через Strm от NetMasters либо через Indy TCP или UPD (быстрее но файл может прийти не весь).
Комьютер не поддаётся законам физики:
Глюки появляются из неоткуда, файлы пропадают в никуда...
Объём диска называется весом и измеряется в метрах...

---------------------------------------------------
Дрова для модема находятся на диске, а дрова для дисковода - в интернете...
Master-Skull вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компоненты TServerSocket и TClientSocket Vadim Компоненты Delphi 5 15.03.2010 20:34
TClientSocket - сохранение JRcoker Общие вопросы Delphi 4 03.08.2008 00:37
Передача файла через TServerSocket и TClientSocket Vanya Работа с сетью в Delphi 10 08.04.2008 18:12
проблема с TServerSocket и с TClientSocket DOLBY Работа с сетью в Delphi 56 14.01.2008 16:12
Компонент TServerSocket в Delphi 7 dfmb Компоненты Delphi 9 03.08.2007 19:09