На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Пример программирования обращения к IRC
      Не раз уже задавался вопрос про использование MIRC'а...
      Вот и решил показать простейший пример использования и программирования IRC протокола.
      Написание прод этот протокол абсолютно ничем не отличается от написания под все (т.е. почти все) др. сетевые протоколы...
      Так же быдет показан простейши пример: конект к серверу, ответ на запрос ирк сервера, возможность
      посылать фразы в канал....
      Для начала неплохо было бы скачать rfc 1459 для (Internet Relay Chat Protocol).
      Начнем...
      Заведем нужную структуру с необходимой нам информацией. Она может выглядеть примерно так:
      ExpandedWrap disabled
         
        type
          TsInfo = record
            sIP       : String[20];
            sChan  : String[10];
            sNick   : String[10];
          end;


      Все поля будут заполнятся из введеных пользователем строк в Edit'ы.
      ExpandedWrap disabled
         
          Info.sIP   := Edit1.Text; //ИП адрес сервера
          Info.sChan := Edit2.Text; //канал на который будем заходить
          Info.sNick := Edit3.Text; //наш ник


      Так… все что необходимо мы уже имеем. (Все это я тестировал у себя в локалке!!! Так что и у вас должно работать =()

      Теперь, первое, что нам необходимо, это, собственно, приконекатся к серверу. В примере я использовал стандартный компонент TClientSocket (я обозвал его «cs»).
      Заполним необходимые для соединения данные:
      ExpandedWrap disabled
         
        cs.Address := Info.sIP;
        cs.Port    := 6667; //выбираем стандартный порт (у вас может быть другой)


      Ну и далее, стандартное для TClientSocket соединение
      ExpandedWrap disabled
         
        cs.Active := TRUE;


      Все, если все ок, то мы должны присоеденится. Далее мы хотели зайти на канал – попробуем сделать это!
      ExpandedWrap disabled
         
        OnConnect: begin
         cs.Socket.SendText('NICK' + ' ' + Info.sNick + #13#10);
         cs.Socket.SendText('USER' + ' ' + Info.sNick + ' ' + 'test' + ' test' + 'test' + #13#10);
        end;

      Все необходимые команды берутся из выше указанного rfc.

      Но нельзя пропустить то обстоятельство, что сервер постоянно проверяет вашего клиента на «валидность», используя при этом команду «PING ‘rnd строка’», нам же в этом случае необходимо будет ответить на этот запрос, примерно так «PONG ‘rdn строка’». После этого мы должны стать «своими» на сервере! Пробудем:
      ExpandedWrap disabled
         
        OnRead:
        begin
         sText := cs.Socket.ReceiveText;
         tmp := copy(sText, 1, 4);
         if (tmp = 'PING') then begin
          tmp := ' '; tmp := copy(sText, pos(' ', sText)+2, length(sText)-6);
          cs.Socket.SendText('PONG' + ' ' + tmp + #13#10);
          cs.Socket.SendText('JOIN' + ' #' + Info.sChan + #13#10);
         end;
         Memo1.Lines.Add(sText)
        end;


      Тут же ( cs.Socket.SendText('JOIN' + ' #' + Info.sChan + #13#10);
      )
      мы заходим на канал Info.sChan, замечу, что перед именем канала должен стоять символ «#».

      Вот почти и все, осталось сделать возможность отсылать сообщения.
      ExpandedWrap disabled
         
        OnClick:
        cs.Socket.SendText('PRIVMSG #' + Info.sChan + ' :' + Edit4.Text + #13#10);

      После этого текст из Edit4 должен попасть на канал sChan, за отсылку сообщений ответственна команда «PRIVMSG».

      Вообщем это все!!! Небольшой пример прилагается. Если что спрашивайте – может отвечу =)
      Прикреплённый файлПрикреплённый файлzIRC.ace (6.86 Кбайт, скачиваний: 368)
        M
        Тема перенесена из Delphi -> Delphi: Общие вопросы.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0251 ]   [ 16 queries used ]   [ Generated: 2.05.24, 11:52 GMT ]