Клиент-сервер C#-PHP

Discussion in 'Песочница' started by Lavrin, 17 Sep 2015.

  1. Lavrin

    Lavrin New Member

    Joined:
    13 Jul 2015
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    Добра.

    Хочу реализовать проект, но пока не знаю точно как.
    Идея такова:
    На локальном сервере\хостинге лежит сайт.
    Клиент на C# раз в какое-то время берет скрин экрана и отправляет на этот сайт (Может POST запросом как-то).
    На сайте он выводится.

    Взять скрин, преобразовать его в byte[] я, допустим, смогу.
    Вопрос: как реализовать получение\отправку файла?

    Подскажите, пожалуйста, как это лучше реализовать.
    Как в C# составить запрос и обработать его в PHP?
    Ткните носом в методы PHP.
     
  2. ZodiaX

    ZodiaX Reservists Of Antichat

    Joined:
    7 May 2009
    Messages:
    533
    Likes Received:
    308
    Reputations:
    51
    Не проще скрин каким нибудь scp отправлять в определенную папку на сервере?
     
  3. Lavrin

    Lavrin New Member

    Joined:
    13 Jul 2015
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    Ну, возможно и проще. Вы знаете как это сделать на шарпе проще, чем POST запросом?
     
  4. ZodiaX

    ZodiaX Reservists Of Antichat

    Joined:
    7 May 2009
    Messages:
    533
    Likes Received:
    308
    Reputations:
    51
    Вы не совсем поняли. Зачем на шарпе писать "велосипед", когда можно сделать батник из двух строк. Отправлять скрин проще тем же WinSCP (https://winscp.net/eng/docs/commandline).
     
  5. hesher

    hesher Elder - Старейшина

    Joined:
    23 Aug 2005
    Messages:
    74
    Likes Received:
    108
    Reputations:
    4
    Если Вы уверены, что хотите именно этого, то:

    Клиентская часть (C#):
    Code:
     
      Rectangle screenDimensions = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
      Size s = new Size(screenDimensions.Width, screenDimensions.Height);
      Bitmap screen = new Bitmap(s.Width, s.Height);
      Graphics memoryGraphics = Graphics.FromImage(screen);
      memoryGraphics.CopyFromScreen(0, 0, 0, 0, s);
      string fileName = Path.GetTempFileName();
      screen.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
    
      WebClient fileUploader = new WebClient();
      fileUploader.UploadFileAsync(new Uri("http://localhost/122/server.php"), "POST", fileName); 
    
    Серверная (PHP):
    PHP:
    <?php

    $dataDir 
    __DIR__."/screens/";
    move_uploaded_file($_FILES['file']['tmp_name'], $dataDir.date("Y_m_d__H_i_s").'.jpg');
    Не забудьте предварительно создать на сервере папку(/screens/) и выставить соответствующие права, если будут проблемы с сохранением.
     
    #5 hesher, 21 Sep 2015
    Last edited: 21 Sep 2015
    Lavrin likes this.
  6. Lavrin

    Lavrin New Member

    Joined:
    13 Jul 2015
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    ИМЕННО! Именно это я уже два дня ищу. Спасибо
     
  7. Lavrin

    Lavrin New Member

    Joined:
    13 Jul 2015
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    Дальше, как я понимаю, нужно создать отдельную html страничку, на которой js будет тягать из этой папки файлы и выводить. Верный ход мыслей, или можно сделать проще?
     
  8. hesher

    hesher Elder - Старейшина

    Joined:
    23 Aug 2005
    Messages:
    74
    Likes Received:
    108
    Reputations:
    4
    Можно пойти несколькими путями, самый простой (но не самый оптимальный, с точки зрения нагрузки) - при обращении к файлу screens.php в той же папке, где и server.php - он производит сканирование директории картинок и выдает в формате:
    <img src='http://localhost/122/screens/2015_09_21__18_46_19.jpg'><br \>
    <img src='http://localhost/122/screens/2015_09_21__18_54_32.jpg'><br \>
    <img src='http://localhost/122/screens/2015_09_21__19_06_31.jpg'><br \>

    Соответственно, можно либо отдельно использовать (обращаться непосредственно к нему, чтобы все картинки посмотреть), либо вставить полученный результат в нужную Вам страницу.

    Код screens.php:
    PHP:
    <?php

    $httpCurr 
    'http://localhost/122/'//URL 'путь' до админки
    foreach (glob('screens/*.jpg') as $currentGlob)
        echo 
    "<img src='$httpCurr$currentGlob'><br \>".PHP_EOL;
    В дальнейшем можно будет легко дописать фильтр, который будет только по определенным датам выводить и т.д.
     
    Lavrin likes this.
  9. Lavrin

    Lavrin New Member

    Joined:
    13 Jul 2015
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    Да, это отлично, но я столкнулся с ещё одной проблемой. Я называл файл просто img.jpg и перед записью просто удаляю предыдущий. Меня это абсолютно утраивает, так как я хочу видеть экран в реальном времени (с интервалом в секунду). Но беда в том, что браузер запоминает имя файла, кешурует, и выводит постоянно первых, хотя после этого я пересохранил файл уже кучу раз. Как это бороть?
     
  10. hicel

    hicel New Member

    Joined:
    19 Aug 2015
    Messages:
    9
    Likes Received:
    3
    Reputations:
    0
    Запрет на кеширование:
    PHP:
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Expires: " date("r"));
     
    Lavrin likes this.
Loading...