Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание клиент-серверного сетевого чата [D6, WinXP]


Страницы:   1 2 3

Тема ©   (2007-01-07 02:18:00) 

Доброй ночи, уважаемые программисты!У меня возникла проблема. В локальной сети у нас ~150 человек. Хочу написать сетевой чат для этой сети. Естественно он должен быть клиент-серверный при таком количестве человек, UDP тут не катит. Как можно реализовать передачу файлов между пользователями в данной ситуации, минуя прохождение данных через сервер. То есть сервер должен только установить соединение между клиентами, а передача должна идти только между ними, иначе, как вы понимаете сервак будет загружен, и, следовательно, скорость передачи будет просто мизерной.
Мне кажется, надо использовать компоненты IdTCPClient и IdTCPServer с вкладок Indy. С Delphi идет пример чата с использованием этих компонентов, но там только пример передачи строчного сообщения, и принцип такой: клиент отсылает сообщение на сервер, сервер принимает его и через цикл отсылает всем необходимым пользователям (функции WriteLn() и ReadLn()). Если использовать функции WriteStream() и ReadStream() этих компонентов, то принцип передачи потока, как я понимаю, будет осуществляться через сервер и ничего хорошего не получится.
Что делать? Help...


Officeman   (2007-01-11 15:26:00) [1]

всему своё время.

2ALL
уважаю ваше слово.


Сергей М.   (2007-01-11 14:27:00) [2]


> Officeman   (11.01.07 14:02) [39]


разумеется)

Но провал обеспечен.

Хотя бы потому, что справка по стандартным Делфи-компонентам писана для Пушкина, и чтение справки - не царское дело)


Anatoly Podgoretsky   (2007-01-11 14:08:00) [3]

> Officeman  (11.01.2007 14:02:39)  [39]

Мнение?
Простое наблюдение.


Officeman   (2007-01-11 14:02:00) [4]


>Рекомендую отказаться, пока не поздно.
>С такими знаниями проект обречен на провал.


это ваше личное мнение.


Сергей М.   (2007-01-11 13:49:00) [5]


> всё это напрямую зависит от множества факторов


Именно так.


> предугадать PING при 3'000 пользоваттелей невозможно ?


Причем здесь PING ?
Ты что, ICMP-сервер пишешь ?


> получили заказ на игровой интернет проект.
> нужны реальные цифры. что досягаемо, а что запредельно.


Рекомендую отказаться, пока не поздно.
С такими знаниями проект обречен на провал.


Officeman   (2007-01-11 13:33:00) [6]

получили заказ на игровой интернет проект.
нужны реальные цифры. что досягаемо, а что запредельно.


Officeman   (2007-01-11 13:30:00) [7]

да. т.е.  

сколько может работать одновременно клиентов.
при условии, один клиент хавает трафика 1 Kb/мин.  (усредненно)

вообще это возможно расчитать без физич. сервера???

или всё это напрямую зависит от множества факторов
и предугадать PING при 3'000 пользоваттелей невозможно ????
и предугадать PING при 8'000 пользоваттелей невозможно ????


Сергей М.   (2007-01-11 13:28:00) [8]


> как узнать максимально возможное колличесво подсоединенных
> клиентов


Узнать у кого?


> какая будет примерно задержка получении ответа от сервера
> для 3'000-го  клиента


В среднем примерно такая же, как и для любого другого клиента этого сервера.


Officeman   (2007-01-11 12:53:00) [9]

на примере чата. список участников ненадо отсылать всем сразу. только по запросу клиента. Чат состоит из комнат. максимально в комнете может присутствовать 100 человек. т.е. таких комнат будет до 30 штук.
сообщения крутятся внтури одной комнаты.  програмно для каждой новой созданной комнаты создаётся отдельная виртуальная среда(на сервере) ведётся обработка этих данных


Officeman   (2007-01-11 12:46:00) [10]

я понимаю вопрос немного некорректный. но как узнать максимально возможное колличесво подсоединенных клиентов - при условии что задержка у клиентов с широким каналом будет не более 10 секунд (клиент-сервер-клиент)

-мне бы узнать результат работы при 3'000 пользователей на одном сервере.
допустим чат, с использованием клиент-сервера на WinSockets

При условии:
- сервер. терминал в аренду у ГолденТелеком(Москва). - мощная выч.станция
- клиенты по всей России.

алгоритм серверной части поддерживает списки заданий.

-какая будет примерно задержка получении ответа от сервера для 3'000-го  клиента подключен.к серверу в реал тайм  ?


Zeqfreed   (2007-01-11 11:32:00) [11]

А какие такие тормоза возникают при использовании VypressChat? У нас в локалке пока около 60 человек максимум одновременно, работает сносно. Кстати, если хочется посмотреть на реализацию, можно взять исходники Trix'а (trix.sf.net) - клиент под линукс, поддерживает протокол VypressChat версии 2.0.


Сергей М.   (2007-01-11 11:04:00) [12]


> использовать любые нерационально при написании серверной
> части игрового проекта


"Нерационально" это как ? И почему ?
Только не надо тут про "слишком большой экзешник")


> будем писать на винсокетах


А все вышеперечисленные тобой компоненты что, не на "винсокетах" написаны по-твоему ?


Officeman   (2007-01-11 11:00:00) [13]

спасибо за ответы.

>Бери любые.
не. использовать любые нерационально при написании серверной части игрового проекта. будем писать на винсокетах.


Сергей М.   (2007-01-11 10:11:00) [14]


> TcpServer.OnAccept   создаёт новый сокет оказывается


Нет, не создает.
На момент возникновения этого события новый сокет ужесоздан, о чем собственно это событие и говорит.


> есть ещё внутренние события для отправки и получени сообщений.
>
> тока незнаю какие.


Справку читать наконец будем или нет ?
OnSend, OnReceive видишь там ?


> какие компоненты выбрать


Бери любые.


Officeman   (2007-01-11 10:05:00) [15]

2Сергей М.
ааа.... ;) TcpServer.OnAccept   создаёт новый сокет оказывается.
потому у меня тока одно сообщение и проходит. т.е.
значит есть ещё внутренние события для отправки и получени сообщений.
тока незнаю какие.

вопрос в другом. я запутался какие компоненты выбрать для использования их возможностей в игровом пошаговом интернет проекте. (клиент-сервер)

1.  (ServerSocket1,ClientSocket1)
2.  (TcpServer1,IdTCPClient1) Indy
3.  свои


Сергей М.   (2007-01-11 09:44:00) [16]

Ты вообще-то понимаешь, когда возникает событие TcpServer.OnAccept и что оно означает ? Справку штудировал ?


Officeman   (2007-01-11 09:34:00) [17]

2Джо,  угу.

Вопрос. при отправки сообщения создаётся новое соединение.
и потом disconnect. т.е. вечное юзание сервера. мне так ненадо.
нужно. Клиент соединился. всё зашибись). теперь передаём сообщения
столько раз - сколько требуется.  Почемуто при отправке второго соообщения
TcpClient1.ReceiveLn()   уже ничему неравен. .. но если сделать дисконнект и нова коннект. то проходит новое сообщение.

Сервер

procedure TForm1.TcpServer1Accept(Sender: TObject;  ClientSocket: CustomIpClient);
begin
// получили Пароль от клиента
pas:=ClientSocket.ReceiveLn;
//...
//ответ от сервера - передача сообщения зарегистрированному пользователю
//if  pas=Trim(user)  then ....................
ClientSocket.SendLn(mess); // отсылаем сообщение
end;


Клиент


procedure TForm1.Connect1Click(Sender: TObject);
begin
TcpClient1.RemoteHost:='127.0.0.1';
TcpClient1.RemotePort:='8888';
TcpClient1.Connect;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if TcpClient1.Connect  
then begin
  TcpClient1.SendLn(pass); // послали пароль
  Edit1.Text:=TcpClient1.ReceiveLn();   // приняли сообщение
end
else MessageBox(Handle, 'Сервер не найден!', 'Error', 16);
end;
end;


Джо   (2007-01-11 08:20:00) [18]

> [23] Officeman   (11.01.07 08:11)

Ты тот пример уже усвоил, который я тебе выкладывал (от Lamers@fools.ua)?


Сергей М.   (2007-01-11 08:17:00) [19]


> пробовал. неполучается


Показывай как пробовал ..


Officeman   (2007-01-11 08:11:00) [20]

Господа!

обычно происходит так.   коннект - ответ - запрос и передача - дисконнект.

вопрос: как сделать

коннект - ответ -
запрос и передача
запрос и передача
запрос и передача
запрос и передача
запрос и передача
....(NN раз)
- дисконнект

т.е. передать много данных.  например при реализации интернет игры.
один раз соединившись. производить много передачи данных. и по команде пользователя разъединится.

p.s. пробовал. неполучается на стандарноых компонентах D6.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо