Многопользовательский чат (не для локалки) Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by bertys, 1 Feb 2014.

  1. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Приветствую
    Объясните пожалуйста как создать многопользовательский чат (НЕ для локалки). Для локально сети примеров куча, но это не то.

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

    Клиент пишет на сервер, а сервер уже передает сообщение или всем или одному.

    Теперь вопросы.
    1) Подойдет ли дедик для установки программы "Сервер"?
    2) Какие протоколы использовать (скорость передачи текста важна)?
    3) Как осуществить чат так чтобы между ПК передавать данные, а не по локалке? Может у кого то есть исходники?
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    1) Да
    2) TCP, UDP
    3) sf.net, code.google.com
     
  3. madhatter

    madhatter Member

    Joined:
    7 Aug 2013
    Messages:
    562
    Likes Received:
    50
    Reputations:
    54
    1) Да.
    2) irc\xmpp
    >> Как осуществить чат так чтобы между ПК передавать данные, а не по локалке?
    шта?
     
  4. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    С этими протоколами есть куча примеров, но они работают только по локальной сети, а если я ставлю сервер на дедик (1.1.1.1@admin:123), затем в клиенте указываю ip сервера 1.1.1.1, то ничего не выходит.

    Просто есть куча примеров с чатом по локальной сети, а просто между компами (не в локалке) нету
     
  5. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    1) для сервера подойдет любая машина, которая будет иметь белый и желательно статический IP
    2) на счет tcp и udp, то тут есть небольшая ремарка, udp быстрее, не устанавливает соединения и не проверяет целостность данных, то есть проверку на целостность переданных/полученных данных придется производить самому, и если учитывать, что потребуется передача файлов, то тут лучше использовать tcp
    3) не понятно сформулирован вопрос

    ps: те реализации чатов для локалки, что в основном выкладывается в сети, используют для отправки сообщения "остальным" клиентам многоадресную рассылку (аля 192.168.1.255 ), что не подходит для работы через инет
     
  6. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Я не могу понять понять как сделать чтоб по сети сообщение, передавать, по локалке ясно.
    Можно ли переделать локальный чат, для того чтоб через инет обмениваться сообщениями, если да, то как?


    Клиент должен быть на компе с ип:193.109.*.*, а сервер на дедике
     
    #6 bertys, 1 Feb 2014
    Last edited: 1 Feb 2014
  7. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    а в чем проблема, если не вдаваться в подробности, то централизованная схема может такой: есть сервер, есть клиенты. Сервер принимает коннекты от клиентов и управляет пересылкой сообщений от клиента к клиенту. То есть является ядром, центром, и должен выполнять возложенные на него функции по авторизации, отслеживанию клиентов, пересылке пакетов, предоставлении информации о клиентах и т.д. и т.п. все что будет заложено в протокол.
    Для понимания и возможных реализаций можно посмотреть доку по тем же IM протоколам, например icq, obimp, mra.

    а так, без обид, если не требуется создать именно свое, то с вашими знаниями в данной области, лучше заюзать что-то готовое, например bimoid
     
  8. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Схему того как это организовать я знаю, но не могу передать сообщение, только в локальной сети получается. Нужно именно написать программу, а не брать готовую
     
  9. Nu11ers3t

    Nu11ers3t Member

    Joined:
    1 Aug 2013
    Messages:
    38
    Likes Received:
    25
    Reputations:
    19

    Порты то открой на серверной машине.....
     
  10. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Порт открыл, так как тут написано, но я так понимаю что может быть такое что на роутере порт закрыт. Как проверить открытость порта
     
    #10 bertys, 1 Feb 2014
    Last edited: 1 Feb 2014
  11. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    что показывает netstat -an и telnet ip : port коннектится или как?
     
  12. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Не могу понять, когда это писать, когда моя прога сервер включена?
     
  13. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    netstat -an на сервере, посмотреть, прослушивается ли порт или нет.
    telnet ip : port с локальной машины (на Win7 надо включить еще клиента в "Программы и компоненты"), где ip - адрес сервера, port - открытый порт на сервере.
     
  14. Nu11ers3t

    Nu11ers3t Member

    Joined:
    1 Aug 2013
    Messages:
    38
    Likes Received:
    25
    Reputations:
    19
    Да, когда включена.

    Тебе конечно уже ответили, но что бы с клиентской частью не париться можешь на canyouseeme.org с серверной машины зайти и проверить прослушивается порт или нет
     
  15. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,284
    Reputations:
    327
    да напиши свой протокол,
    банально
    typedef struct _PACKET_HEADER
    {
    DWORD dwType; // 0 - text, 1-binary data, etc
    DWORD dwSize;
    BYTE szPayload[0];

    }PACKET_HEADER, *PPACKET_HEADER;

    ясное дело что допилишь всякие поля когда идут метаданные юзается шифрование итд- ну ты понел я думаю