Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/98: Рейтинг темы: голосов - 98, средняя оценка - 4.74
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241

Чат локальной сети (сервер + много клиентов)

21.07.2011, 19:41. Показов 18033. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!!!!

Прошу поделиться опытом по созданию клиент-серверных приложений в Delphi7.

Основные задачи чата:
1) Чтобы пользователи могли отправлять сообщения друг другу через сервер.
2) Создание конференций для нескольких пользователей (2 и более).
3) Чтобы пользователи могли отправлять файлы друг другу минуя сервер. (Если нельзя, то хотябы через сервер).
4) Ну и чтобы сервер сам мог принимать и отправлять сообщения или файлы от пользователей.
5) Ну и надежность работы имеет очень важное значение.

И собственно цель создания темы, вопросы:
1) Какими технологиями и компонентами лучше пользоваться? Я склоняюсь к использованию TServerSockets, TClientSockets. Может есть что лучше?
2) Вопрос по скорости работы. Опять же какая технология лучше и какие компоненты?
3) И как надежно передавать файлы? Алгоритм.

Необязательно, но буду признателен за какие нибудь еще мысли, советы, ссылки, исходники.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.07.2011, 19:41
Ответы с готовыми решениями:

Чат для локальной сети
Попытался сделать чат с помощью одной книжки "Прогаммирование в Delphi глазами хакера"(сам я только начинаю познавать delphi). ...

Чат для локальной сети
у кого нибудь есть готовые Чат программы :)

Чат для локальной сети с использованием TClientSocket & TServerSocket
Нужен пример чата для лок. сети, с использованием TClientSocket & TServerSocket! //желательно попроще

7
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
22.07.2011, 13:21
TCPClient, TCPServer - для организации связи между пользователями, обменом сообщениями и тд.
Для передачи файлов - UDPClient, UDPServer.
Если файлы не большие, можно обойтись и TCP протоколом.

Добавлено через 5 минут
Сначала продумайте структуру сервера, как будут устроены комнаты(конференции), создайте объекты для хранения информации о пользователях, скажем в какой комнате он находится и тд и тп.
Только после этого думайте о реализации сетевого взаимодействия.

Добавлено через 1 минуту
Если это университетское задание(даже если и нет), то можете начертить UML диаграмму классов, блоксхемы важных участков кода, потом будет проще ориентироваться.
1
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
22.07.2011, 18:10  [ТС]
John_Pa9JIbHuK, это я пишу для организации в которой работаю. Порядка 50-80 пользователей.
Есть простенький чат, файлы пересылаются большие, иногда архивы 2-3 гб. Но мне нужен специфический, с передачей служебной информации и т.п., вот и взялся сам написать.
UDPClient, UDPServer - по ним будем пересылать файлы. А для текста тогда тоже их использовать, или еще и TCPClient, TCPServer использовать?

TServerSockets, TClientSockets я так понял отпадает?
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
22.07.2011, 20:56
Можно обойтись и UDP, но я бы еще использовал TCP исключительно для пересылок сообщений.
1
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
24.07.2011, 08:08  [ТС]
Появилась проблема широковещания.

Одному клиенту понятно как (пример из Delphi)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.btnSendClick(Sender: TObject);
var
  I: Integer;
begin
  TcpClient1.RemoteHost := edtRemoteHost.Text;
  TcpClient1.RemotePort := edtRemotePort.Text;
  try
    if TcpClient1.Connect then
      for I := 0 to memSend.Lines.Count - 1 do
      TcpClient1.Sendln(memSend.Lines[I]);
  finally
    TcpClient1.Disconnect;
  end;
end;
А как если их 150-200????????????
0
19 / 19 / 0
Регистрация: 22.07.2011
Сообщений: 68
24.07.2011, 11:04
ПРИМЕЧАНИЕ

Серверные сокеты Indy позволяют устанавливать связь с несколькими IP-адресами и/или портами, используя набор связывания Bindings collection.

Из этого следует, что в программе клиента можно соединится с сервером, выполняя IdTCPClient1.Connect.

Программа сервера регистрирует всю информацию. Когда клиент устанавливает или обрывает связь, программа записывает IP этого клиента наряду с выполняемой в данный момент операцией, как в следующем случае OnConnect:

procedure TFormServer. IdTCPServer1Connect (AThread: TIdPeerThread);
begin
lbLog.Items.Add. ('Connected from: ' +
AThread. Connection.Socket.Binding.PeerIP);
end
Взято из http://www.delphimaster.ru/boo... gment.html
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
24.07.2011, 12:11
Sergio-X86
1) Это клиент, кусок вашего кода, клиент отсылает сообщение на сервер, скажем строку "messageAll=Всем привет", сервер получает сообщение смотрит, так значить messageAll, понимает что это означает оправку сообщения всем пользователям, и оправляет всем сообщение Всем привет.
2) Как клиенту получить сообщение от сервера?
Я делал так, конструируешь новый поток, который будет исключительно принимать сообщение от сервера, переопределив его метод execute:
//До тех пор пока подключены
Delphi
1
2
3
4
5
6
7
8
9
10
11
while TCPclient.connected do
begin
  try
    //Сообщение от сервера
    Message := TCPclient.Readln();
    if Message = ... then ....
  except
    //Если он ничего не прочтет, выбросит исключение, и мы его обрабатываем и все норм 
    on EidReadTimeOut do;
  end;
end;
Добавлено через 15 минут
3) На сервере:
Создайте класс TUsers, TRoom.
У Users думаю будут следующие поля:
а)Имя
б)Еще чтото, на ваше усмотрение
.....
.....
в)Идентификатор его соединения, его получите когда польз. будет подключаться к серверу:
Connection: TIdTCPServerConnection;
Получаем Connection:
У сервера есть событие onExecute вот, в нем пишите:
Надо сказать что в это событие генерируется также при приеме данныъх, и пользователь который к вам подключиться, должен отправить вам свое имя, и тд и тп, вы считываете их
Message = AThread.Connection.Readln();
if Message = "Name" then...
Добавляете польз. и ид его подключение, его Connection = AThread.Connection, и имея этот Connection вы смело отправите юзеру сообщение в любой момент.



г)Указатель на комнату, где он находится: Room: TRoom;

Добавлено через 3 минуты
И еще надо сказать, что TUsers и TRoom лучше хранить в TObjectList
0
0 / 0 / 0
Регистрация: 29.05.2014
Сообщений: 23
28.10.2015, 10:27
А есть исходники?Был бы очень признателен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2015, 10:27
Помогаю со студенческими работами здесь

Чат типа сервер - куча клиентов
Пожалуйста напишите код сервера и клиента, а то я нигде не могу найти, только для С++ Builder! =( ЗЫ: Visual Studio Express 2010

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

Сервер не отправляет сообщ для всех клиентов (ЧАТ с использ-ем сокетов)
В общем такая проблемка небольшая: Сервер не отправляет сообщ для всех клиентов (ЧАТ с использ-ем сокетов).На скрине отчетливо видно,что...

Асинхронный сервер - чат, много сообщений
вобщем сделал некое подобие чата, все вроде бы хорошо - отсылает/принимает сообщения нормально от множества клиентов придумал некую...

Чат. Общение по локальной сети
Здравствуйте! Мне нужно написать программу для передачи сообщений по локальной сети. Подскажите, пожалуйста, с чего мне надо начать?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru