Конференция "Игры" » проект Ангор (саморазвивающийся мир) [Delphi, Windows]
 
  • Gexon © (20.07.09 21:46) [0]
    мы работаем над проектом Ангор (саморазвивающийся мир). Онлайн игра.
    http://angor.3dn.ru

    Вопрос:
    клиентская часть не находит сервер.
    тестировал на своем компьютере(localhost).

    приложение консольное.
    использовал TClientSocket;

    написал мелкое оконное приложение, проблем нет, находит сервер и устанавливает соединение.
    ----------------------------

    помогите!
  • KilkennyCat © (20.07.09 22:39) [1]
    Лошадью ходи.
  • brother © (21.07.09 04:27) [2]
    > Вопрос:
    > клиентская часть не находит сервер.

    вопрос: какие ошибки, как подключаешься?
  • Gexon © (21.07.09 21:08) [3]
    ошибок нет никаких...
    просто пишет что ищет сервер...

    события соединение не происходит
  • brother © (22.07.09 04:12) [4]
    код подключения где? где пишет?
  • Gexon © (23.07.09 19:14) [5]
    unit uClient;

    interface

    uses
     SysUtils, Classes, ScktComp;

    type
     TDataModule1 = class(TDataModule)
       ClientSocket1: TClientSocket;

       procedure ClientSocket1Lookup(Sender: TObject; Socket: TCustomWinSocket);
       procedure ClientSocket1Disconnect(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
         ErrorEvent: TErrorEvent; var ErrorCode: Integer);
       procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
       procedure ClientSocket1Connecting(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
     private
       { Private declarations }
     public
       { Public declarations }
       procedure sendMsg;  // процедура отправки сообщения серверу
       procedure initClient;     // инициализация модуля
       procedure finitClient;    // финализация модуля
     end;

    var
     DataModule1: TDataModule1;
     clientname: string; // храним имя ангор.клиента
     
    implementation

    uses uMenu;

    {$R *.dfm}

    //------------------------------------------------------------------------------
    // Инициализация сокета, открытие соединения
    //------------------------------------------------------------------------------
    procedure TDataModule1.initClient;
    var do_connect: Boolean;
    begin
     ClList.Add('Инициализация соединения');
     {Показываем окно установки соединения с сервером}
     //Form2 := TForm2.Create(Application);
     {do_connect = True, если была нажата кнопка Connect}
     do_connect := true; //(Form2.ShowModal = mrOk);
     clientname := 'Cln.ang.tst';//Form2.Edit3.Text;
     {Уничтожаем форму}
     //Form2.Free;
     {Если была нажата кнопка Cancel, то уходим отсюда}
     if not do_connect then
      Exit;
     {Если соединение уже установлено, то обрываем его}
     if DataModule1.ClientSocket1.Active then
       DataModule1.ClientSocket1.Close;
     {Устанавливаем свойства Host и Port}
     DataModule1.ClientSocket1.Host := 'localhost';
     DataModule1.ClientSocket1.Port := 4232;
     {Пытаемся соединиться}
     DataModule1.ClientSocket1.Open;
     //ClList.Add('Инициализация выполнена');
    end;  //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // Закрытие сетевого подключения
    //------------------------------------------------------------------------------
    procedure TDataModule1.finitClient;
    begin
     ClList.Add('Закрываем соединение');
     {Закрываем соединение (если оно установлено)}
     if DataModule1.ClientSocket1.Active then
       DataModule1.ClientSocket1.Close;
     ClList.Add('Cоединение успешно закрыто!');
    end;  //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // Обработка ошибок
    //------------------------------------------------------------------------------
    procedure TDataModule1.ClientSocket1Error(Sender: TObject;
     Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
     var ErrorCode: Integer);
    begin
     {Если произошла ошибка, выводим ее код в Memo1}
     {Insert вставляет строку в указанную позицию (в данном случае - 0 - в начало)}
     ClList.Add('Ошибка сокета ('+IntToStr(ErrorCode)+')');
    end;  //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // Поиск сервера
    //------------------------------------------------------------------------------
    procedure TDataModule1.ClientSocket1Lookup(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
     {Сообщаем о том, что идет поиск хоста}
     ClList.Add('Одну минуту, ищем сервер...');
    end;  //------------------------------------------------------------------------
  • Gexon © (23.07.09 19:14) [6]
    //------------------------------------------------------------------------------
    // Процесс стыковки
    //------------------------------------------------------------------------------
    procedure TDataModule1.ClientSocket1Connecting(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
     {соединяемся...}
     ClList.Add('Сервер найцден, соединяемся...');
    end;  //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // При удачном соединении
    //------------------------------------------------------------------------------
    procedure TDataModule1.ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
     {соединились!}
     ClList.Add('Соединение прошло успешно! Грац!');
    end; //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // Отсоединились
    //------------------------------------------------------------------------------
    procedure TDataModule1.ClientSocket1Disconnect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
     {отсоединились :(}
     ClList.Add('Отсоединились');
    end;  //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // Читаем данные с сокета
    //------------------------------------------------------------------------------
    procedure TDataModule1.ClientSocket1Read(Sender: TObject;
     Socket: TCustomWinSocket);
    var s,from_,to_: string;
    begin
     {присваиваем s полученную от сервера строку}
     s := Socket.ReceiveText;
     
     {Если сервер посылает нам User List}
     if Copy(s,1,2) = '#U' then
       begin
         Delete(s,1,2);
         {Чистим ListBox1}
         //ListBox1.Items.Clear;
         {Добавляем по одному юзеру в список. Имена юзеров разделены знаком ";"}
         while Pos(';',s) > 0 do
           begin
             //ListBox1.Items.Add(Copy(s,1,Pos(';',s)-1));
             Delete(s,1,Pos(';',s));
           end;
         Exit;
       end;

     {Если нам прислали общее сообщение (видимое для всех юзеров)}
     if Copy(s,1,2) = '#M' then
       begin
         Delete(s,1,2);
         {Добавляем его в Memo1}
         ClList.Add(Copy(s,1,Pos(';',s)-1)+'> '+ Copy(s,Pos(';',s)+1,Length(s)-Pos(';',s)));
         Exit;
       end;

     {Если нам прислали запрос на наше имя юзера}
     if Copy(s,1,2) = '#N' then
       begin
         {Посылаем ответ}
         Socket.SendText('#N'+clientname);
         Exit;
       end;

     {Если нам прислали приватное сообщение (или не нам :) )}
     if Copy(s,1,2) = '#P' then
       begin
         Delete(s,1,2);
         {Выделяем в to_ - кому оно предназначено}
         to_ := Copy(s,1,Pos(';',s)-1);
         Delete(s,1,Pos(';',s));
         {Выделяем в from_ - кем отправлено}
         from_ := Copy(s,1,Pos(';',s)-1);
         Delete(s,1,Pos(';',s));
         {Если оно для нас, или написано нами - добавляем в Memo1
         (иногда полезно убрать этот оператор if :) )}
         if (to_ = clientname)or(from_ = clientname) then
         ClList.Add(from_+' (private) > '+s);
         Exit;
       end;
    end;  //------------------------------------------------------------------------

    //------------------------------------------------------------------------------
    // Процедура отправки сообщения серверу
    //------------------------------------------------------------------------------
    procedure TDataModule1.sendMsg;
    var s: string;
    begin
     {Если мы хотим послать приватное сообщение, но не выбрали адресата -
      нас покарают замечанием :) и выгонят из обработчика}
     //if (CheckBox1.Checked)and(ListBox1.ItemIndex < 0) then
       //begin
         //ShowMessage('At first you should select the user in the User List!');
         //Exit;
       //end;

     {Если это приватное сообщение}
     if false{CheckBox1.Checked} then
      s := '#P'+ {ListBox1.Items[ListBox1.ItemIndex]+}';' {добавляем спец.команду и адресат}
     else {А если не очень приватное?}
      s := '#M'; {Просто спец.команду}
     {Добавляем наше имя (от кого) и само сообщение}
     s := s + clientname + ';' + 'текст сообщения'{Edit1.Text};
     {Посылаем все это добро по сокету}
     ClientSocket1.Socket.SendText(s);
    end;  //------------------------------------------------------------------------

    end.
  • Gexon © (23.07.09 19:16) [7]
    почему-то событие "ClientSocket1Connecting", так и не происходит....

    Еще раз повторяю, приложение консольное, использовал модуль с DataModule, для того чтоб разместить в нем TClientSocket
  • Gexon © (29.07.09 13:41) [8]
    все, разобрался...
    сделал обработчик событий
  • zewwer © (12.11.13 18:28) [9]
    ну хотя бы выложи сюда посмотреть на исходник...

    _______
    http://www.audit-escort.ru/
 
Конференция "Игры" » проект Ангор (саморазвивающийся мир) [Delphi, Windows]
Есть новые Нет новых   [118655   +14][b:0][p:0.001]