На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Передача картинки через сокет , (по примеру FAQ)
    Нужно передать картинку через сокет

    Клиент обращается к серверу и запрашивает картинку, потом ее принимает...

    ExpandedWrap disabled
       
       
      {str:TMemoryStream;}
       
      //Сервер
       
      //Создается картинка
          Jpg:= TJpegImage.Create;
          form1.makescreen(Jpg);
          jpg.CompressionQuality:=15;
          jpg.Compress;
       
      //Записывает ее в поток
          str:=TMemoryStream.Create;
          str.Position:=0;
          jpg.SaveToStream(str);
       
      //передаем клиенту размер картинки
          ClientSocket.Sendln(inttostr(str.Size));
          str.Position:=0;
       
      //передаем клиенту картинку
          ClientSocket.SendStream(str);
          str.Free;
          jpg.Free;
       
       
       
      //Клиент
       
      //Запрос картинки
         form1.TcpClient1.Sendln('s');
       
      //Зодаем поток
         str:=TMemoryStream.Create;
       
       
      //получаем размер принимаемой картинки
         size:=form1.TcpClient1.Receiveln;
       
         str.Position:=0;
       
         buf:=???? //Вот здесь надо указать будер размером size!!!! Как????
       
         form1.TcpClient1.ReceiveBuf(buf, strtoint(size));
         form1.TcpClient1.Disconnect;
       
         str.WriteBuffer(buf, strtoint(size));
         str.Position:=0;
       
         Jpg:= TJpegImage.Create;
         jpg.LoadFromStream(str);
         Jpg.SaveToFile('c:\test2.jpg');
         dispose(buf);
         Jpg.Free;
         str.Free;



    Помогите братцы 8))) Что не так???
      А чего не работает-то?
        Сервером картинка посылается, без возникновения ошибок.
        На клиенте возникает ошибка "Access Violation"

        память под buf выделяю так

        GetMem(buf, strtoint(size)+1);

        где size получен с сервера
          Дык читай картинку в TMemoryStream, а потом TMemoryStream.SaveToFile(), когда файл примется полностью.
            Сейчас делаю так

            ExpandedWrap disabled
               
              var size:string;
                  str:TMemoryStream;
              begin
                 form1.TcpClient1.Sendln('s');
               
                 str:=TMemoryStream.Create;
                 size:=form1.TcpClient1.Receiveln;
               
                 str.Position:=0;
               
                 form1.TcpClient1.ReceiveBuf(str, strtoint(size));
                 form1.TcpClient1.Disconnect;
                 str.Free;
              end;


            То же самое... Ошибка.
              Конечно будет ошибка.
              Ты принимай в строку, а потом строку пиши в TMemoryStream.
              И попробовать я не могу на разных тачках, чтобы определённей сказать..
                Song, Спасибо. Вроде получилось.

                Вопрос еще в дагонку 8)

                На локальном компе сокеты конектятся нормально (причем ip локальной сети использую 192.168.0.2)

                Когда пробую на 2-разных компах, они не хотят соединяться.

                В чем может быть баг? Где рыть? И возможно ли, что в инете это заработает?
                  А что пишет? какая ошибка?
                    Ошибки никакой нет.

                    пытыюсь конект установить

                    if TcpClient1.connect then begin
                    //что-то
                    end
                    else showmessage('Could not connect');

                    и он не устанавливается


                    пусть клиент 192.168.0.1
                    remotehost:=192.168.0.2
                    remoteport:=8888

                    сервер 192.168.0.2
                    localhost:=192.168.0.2
                    localport:=8888
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0.0974 ]   [ 15 queries used ]   [ Generated: 23.10.26, 23:01 GMT ]