Delphi + PHP (клиент-сервер)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 200 OK, 20 Nov 2008.

  1. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    Здравствуйте, я впервые тут пишу, сильно не бейте. )

    Поставил перед собой задачу написать для начала простое клиент серверное приложнение. Подскажите пожалуйста какой протокол и какие компоненты использовать для организации например чата? Серверная часть должна быть на php на удаленном сервере с постоянным IP/ Клиент - на дельфах.
     
    1 person likes this.
  2. FlyBird

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

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Лично мне кажется, что для этого тебе подойдут такие языки как JAVA или C#.
    Возможно и Delphi тоже. В общем тебе нужно капать в сторону сокетов
    _http://ru.wikipedia.org/wiki/Сокет_(программный_интерфейс).
    Если что то на JAVA я смогу тебе кинуть пару строк кода. Они 100% рабочие. Сама тестила собственную аську основанную на сокетах.
     
  3. ronald

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

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    41
    Reputations:
    6
    Так проще

    omg...
    Куда катится мир?
    А слабо встроить код из дельфи в страничку и держать там?:
    1. Создаёшь ActiveX форму
    2. Project -> Web Deployment Options
    3. Пишешь нужный код
    4. Project-> Web Deploy
    5. Подключить готовое сам, думаю разберёшься, если что постучи в асю
    Инфа по теме:
    http://www.codenet.ru/progr/other/delphocx.php
    http://www.codenet.ru/progr/delphi/ax_ie.php
    --------------------------------------------------------------
    Зы: Доберман, тя что забанили? :confused:
     
    #3 ronald, 20 Nov 2008
    Last edited: 20 Nov 2008
  4. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    Если у вас есть php-код с использованием stream_socket_server поделитесь, брал готовый код с мануала - сервер запускается но при попытке принять ответ, приложение дельфи выскакивает с ошибкой "неправильный reply", жаль сечас на работе, вечером обязательно напишу свои исходники на php и delphi а также ошибку
     
  5. FlyBird

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

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Нет. Я на JAVA и C# пишу + Oracle и MSSQL.
    php забросила давно.
    Сори за офтоп, сделала я это для того чтобы автор не ждал от меня кода на php, который я не обещала и не имею. Порты и все дела ты наверника прописываешь. Ждем код, чтобы можно было советовать.
     
    1 person likes this.
  6. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    ппц..
    можна заросто написать на Delphi клиент, которий будет, например, посилать пост\гет запрос на сервер,.. на сервере php принимает команди..
    сам такое делал...
    главное научитса понимать что такое сокети..
     
  7. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0

    с HTTP проблем не возникало, но тут не получиться организировать мгновенной передачи сообщения, т.к. клиенту нужно будет проверять через некоторые промежутки времени (например 5сек) есть ли для него новое сообщение или нет
     
  8. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    и?
    например:

    имя юзер: tester
    клиен шлет запрос: get.php?name=tester

    get.php:
    Code:
    <?
    if (isset($_GET['name']))
    {.....
    откриваем файл с сообщениями
    или достаем их из бази
    ....
    пусть єсть новое сообщения с текстом: 'hello'
    тогда в $soobschenia будет hello
    .....
    print $soobschenia;
    ?>
    все.. клиен принимает результат: hello..
    на делфи\пхп такое не делают.. надо чтоб многновенно работало..
     
  9. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    через http тащить информацию??? ХИТРОЗАДО както для клиента на Делфи! 8))))))))))

    ... думаю тут все проще пишешь оба сначала на Делфи.... отлаживаешь .... и затем выбираешь язык сервера!

    ... понятно что на античате тебя поведут дорогой http .... но это как из песни "!...идем дорогой трудной дорогой не простой" 8)))


    ЧАТ СЕРВЕРУ НЕ НУЖЕН ВЭБСЕРВЕР (имеется ввиду тот у кого на Делфи клиент)!!!
     
    #9 Delimiter, 20 Nov 2008
    Last edited: 20 Nov 2008
  10. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    возможно я не совсем правильно сформулировал задачу, нужен не чат(это к примеру), а клиент-приложение, которое висело бы в сети и слушало сервер НА НАЛИЧИЕ сообщения... тоисть тут приемлимо использовать tcp протокол

    з.ы. и еще вопрос, возможно ли использовать tcp (например с компонента indy idTCPClient) через http прокси?
     
  11. _Kris_

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

    Joined:
    22 Jul 2008
    Messages:
    53
    Likes Received:
    31
    Reputations:
    5

    Ты хакир...
    Пиздос...
    На*** такие выебоны если легче сделать CGI на дельфах?[Даже кстати можно на паскале...]
    И вообще на*** тут HTTP???
    Давай тогда через Oscar, заодно и с QIP' ом пообщаемся...
    И вообще сервак можно на питоне написать...
    и клиент тоже на питоне...
    ---
    Можно на С++, можно на С# клиента написать, да и сервак на С++ можно...

    Конечно же есть разница на чем писать, но тс вроде попросил сервак на пыхопэ, а клиент на делфи.
    А по теме, WinSock те в помощь(и два путеводителя это Google и MSDN)
    Лучше будет писать на сокетах, wininet тут не годится...
    Если сложно на сокетах, можешь использовать стандартный контрол от Макрософт [подключи в дельфе как активекс] (Microsoft Winsock Control), еще можно через TidTCPClient работать...
    Вообщем варианты я сказал...дальше ориентируйся на свои возможности и выбирай на свой вкус.

    Code:
    [COLOR=Green][SIZE=1][B]P.S.     Набери в гугле: Клиент - сервер DELPHI
    P.p.s.  Результаты 1 - 10 из примерно 117 000 для Клиент - сервер DELPHI. (0,23 секунд) [/B][/SIZE][/COLOR]
    ты прикинь как....
     
    #11 _Kris_, 20 Nov 2008
    Last edited: 20 Nov 2008
    1 person likes this.
  12. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Задача тривиальна, развили тут флейм.
    Обычный ДДоС червь использует подобную схему, идея есть - реализуй.
     
  13. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    Как и обещал, выкладываю:

    Сервер на php, использую стандартный пример из мануала, при коннекте с клиентом посылает ему сообщение string(39) "Hello! The time is 11/20/2008 10:29 pm " такого вида, + если клиент что то отправляет, то string(23) "You have sent : тут echo клиента "

    PHP:
    <?php

    $master 
    = array();
    $socket stream_socket_server("tcp://localhost:10001"$errno$errstr);
    if (!
    $socket) {
        echo 
    "$errstr ($errno)<br />\n";
    } else {
        
    $master[] = $socket;
        
    $read $master;
        while (
    1) {
            
    $read $master;
            
    $mod_fd stream_select($read$_w NULL$_e NULL5);
            if (
    $mod_fd === FALSE) {
                break;
            }
            for (
    $i 0$i $mod_fd; ++$i) {
                if (
    $read[$i] === $socket) {
                    
    $conn stream_socket_accept($socket);
                    
    fwrite($conn"Hello! The time is ".date("n/j/Y g:i a")."\n");
                    
    $master[] = $conn;
                } else {
                    
    $sock_data fread($read[$i], 1024);
                    
    var_dump($sock_data);
                    if (
    strlen($sock_data) === 0) { // connection closed
                        
    $key_to_del array_search($read[$i], $masterTRUE);
                        
    fclose($read[$i]);
                        unset(
    $master[$key_to_del]);
                    } else if (
    $sock_data === FALSE) {
                        echo 
    "Something bad happened";
                        
    $key_to_del array_search($read[$i], $masterTRUE);
                        unset(
    $master[$key_to_del]);
                    } else {
                        echo 
    "The client has sent :"var_dump($sock_data);
                        
    fwrite($read[$i], "You have sent :[".$sock_data."]\n");
                        
    fclose($read[$i]);
                         unset(
    $master[array_search($read[$i], $master)]);
                    }
                }
            }
        }
    }
    ?>

    Далее часть на дельфах

    Создаю форму с елементами Button1, Memo1, компонентами IdTCPClient1, и IdThreadComponent1(чтоб не виснула прога создаем отдельный поток.

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdThreadComponent, StdCtrls, IdComponent,
      IdTCPConnection, IdTCPClient;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        IdThreadComponent1: TIdThreadComponent;
        IdTCPClient1: TIdTCPClient;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure IdThreadComponent1Run(Sender: TIdThreadComponent);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdThreadComponent1.Start;
    end;
    
    procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
    begin
    IdTCPClient1.Host:='92.63.110.20';
    IdTCPClient1.Port:=10001;
    IdTCPClient1.Connect;
    IdTCPClient1.SendCmd('Heloo serv',Memo1.Text);
    end;
    
    end.
    
    Тоисть после нажатия Button1, мы должны отправить сообщение Heloo serv, и получить в ответ в Memo1
    Вместо радости получаю
    Исключение класса EidException с сообщением 'Reply Code is not valid :Hel'.
    Где Hel это по всей видимости ответ сервера "Hello! The t ......

    Помогите йопт

    p.s. порт будет открыт, пробуйте
     
    #13 200 OK, 20 Nov 2008
    Last edited: 20 Nov 2008
  14. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    Да, не спорю ! Клиент сервер Дельфи - есть много примеров и ответов! Но поищи мне ответ на мой вопрос где СЕРВЕРОМ есть машина под unix'ом с использованием php
     
  15. 200 OK

    200 OK New Member

    Joined:
    20 Nov 2008
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    Ура, сделал без потока на стандартном компоненте TcpClient - работает, кроме компоненты тут две кнопки, лейбл, и мемо
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Sockets;
    
    type
      TForm1 = class(TForm)
        TcpClient1: TTcpClient;
        Button1: TButton;
        Label1: TLabel;
        Button2: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure TcpClient1Connect(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    TcpClient1.RemoteHost:='92.63.110.20';
    TcpClient1.RemotePort:='10001';
    TcpClient1.Connect;
    
    
    end;
    
    procedure TForm1.TcpClient1Connect(Sender: TObject);
    begin
    Label1.Caption:='Is connected';
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    TcpClient1.Open;
    TcpClient1.Sendln('Hello');
    Memo1.Text:=TcpClient1.Receiveln();
    TcpClient1.Close;
    end;
    
    end.
    
    
    Будем писать дальше