Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Многопользовательский сервер   Найти похожие ветки 

 
Ozone ©   (2004-03-25 12:58) [0]

Ситуация такая:
8 различных клиентов "одновременно" отправляют каждую секунду картинки (~8 Кб) на сервер.
Как правильно их "одновременно" принять и вывести на экран
(т.е. должно получиться 8 окошечек с меняющимися картинками)


 
Digitman ©   (2004-03-25 13:26) [1]


> Как правильно


что у тебя не получается ?


 
Ozone ©   (2004-03-25 13:28) [2]

Пока не пробовал....
А такое ведь возможно?


 
Verg ©   (2004-03-25 13:32) [3]

Правильный прием по сети - это одно
Првильный вывод на "экран" - это друге.

С чем именно проблемы?


 
Ozone ©   (2004-03-25 13:32) [4]

И еще вопрос: на сервере я же не знаю какого размера придет картинка, но ведь указывать размер надо.

Т.е. пишу

var
  memStream: TMemoryStream;
begin
    memStream := TMemoryStream.Create;
    AThread.Connection.ReadBuffer(memStream, ???);
    memStream.Free;


 
Ozone ©   (2004-03-25 13:35) [5]

Я так понимаю, что в зависимости от клиента (IP), я просто помещаю картинку в нужное место, а Indy сама позаботиться о "параллельном" приеме.
Это верно?


 
Digitman ©   (2004-03-25 13:43) [6]


> Indy сама позаботиться о "параллельном" приеме.
> Это верно?


в целом да, верно


> на сервере я же не знаю какого размера придет картинка


конечно не знаешь ... ты же не предусмотрел передачу такой инф-ции клиентом серверу ПЕРЕД тем как передавать собственно "картинку"

предусмотри это - и вопрос сам по себе рассосется

иными словами, прежде чем писать подобного рода распределенные сетевые приложения, продумай и разработай протокол информационного обмена, в деталях расписав его где-то (хоть на бумаге, хоть сделав тату) и имея всегда перед глазами


 
Ozone ©   (2004-03-25 13:48) [7]

Пасиба, буду пробовать


 
Ozone ©   (2004-03-25 14:13) [8]

Вот накидал кое-что, но не работает

Клиент:


var
  _file: TMemoryStream;
begin
    inc(ImgIndx);
    _file := TMemoryStream.Create;
    _file.LoadFromFile("...");
    try
       tcpClient.Connect();
       tcpClient.WriteLn(IntToStr(_file.Size));
       tcpClient.Socket.Send(_file, _file.Size);
    except end;
    _file.Free;
end;


Сервер (на OnExecute):


var
  size: string;
  _file : TMemoryStream;
begin
    _file := TMemoryStream.Create;
    AThread.Connection.ReadLn(size);
    // вот здесь size оказывается пустым  ...
    AThread.Connection.ReadBuffer(_file,StrToInt(size));
    _file.Free;
end;


 
Ozone ©   (2004-03-25 14:39) [9]

Сервер (на OnExecute):

var
 size: string;
 _file : TMemoryStream;
begin
   _file := TMemoryStream.Create;
   size := AThread.Connection.ReadLn(); // надо было так
   AThread.Connection.ReadBuffer(_file,StrToInt(size)); //теперь на этой строке "повисает"
   _file.Free;
end;


 
Digitman ©   (2004-03-25 14:50) [10]

охх ...

вот ты скажи на милость, вникал ли ты в тип и смысл первого параметра метода ReadBuffer() ?


 
Ozone ©   (2004-03-25 14:52) [11]

Сервер (на OnExecute):


var
size: string;
_file : TMemoryStream;
begin
  _file := TMemoryStream.Create;
  size := AThread.Connection.ReadLn();
  AThread.Connection.ReadStream(_file,StrToInt(size), false);

  // здесь _file = nil     ????

  _file.SaveToFile("temp.jpg");  
  _file.Free;
end;


 
Ozone ©   (2004-03-25 15:08) [12]

точнее не nil, а просто пустой...
Может я отправляю не правильно?


 
Ozone ©   (2004-03-25 15:10) [13]

Пробовал принимать без длины, т.е.

AThread.Connection.ReadStream(_file, -1, true);


Такая же история.


 
Digitman ©   (2004-03-25 15:38) [14]

так ведь передающая-то сторона тоже должна передавать вызовом SendStream ! А у тебя что там ? Send() какой-то ...


 
Ozone ©   (2004-03-25 15:41) [15]

Пробовал также отсылать и принамать простой массив символов - все работает, а с использованием TMemoryStream - не работает

Клиент

const
  Buf : array [1..4] of char = ("1", "2", "3", "4");
begin
    try
       tcpClient.Connect();
       tcpClient.Socket.Send(Buf, 4);
       tcpClient.Disconnect;
    except end;
end;


Сервер

var
  s: string;
  m : TMemoryStream;
begin
    m := TMemoryStream.Create;
    AThread.Connection.ReadStream(m, -1, true);
    m.SaveToFile("tmp.txt");
    m.Free;
end;


 
Ozone ©   (2004-03-25 15:43) [16]

Там нет SendStream...


 
Ozone ©   (2004-03-25 15:46) [17]

ВСЕ ЗАРАБОТАТО....


 
Digitman ©   (2004-03-25 16:17) [18]


> ВСЕ ЗАРАБОТАТО


расчудесно)



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
1-1083240819
фыва
2004-04-29 16:13
2004.05.16
canvas


1-1083157764
killer
2004-04-28 17:09
2004.05.16
Сортировка в StringGrid


3-1082536432
din
2004-04-21 12:33
2004.05.16
Как вывести на форму текущий месяц


1-1083078734
td
2004-04-27 19:12
2004.05.16
про dll совсем элементарное %)


11-1069804916
PA
2003-11-26 03:01
2004.05.16
TreeView