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

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

Пишу свой чат. Помогите! [D7, WinXP]


Mr.Bean ©   (2003-08-16 16:51:00) 

Помогите, кто может! Я пишу чат с помощью сокетов. Как можно сделать рассылку сервером списка абонентов, если их имена содержатся в ListBox"е? И вообще, если кто хочет принять участие в создании чата - пишите мне на e-mail. Заранее большое спасибо.


Mr.Bean   (2003-08-17 19:49:00) [1]

Поэкспериментировал. Оказалось, что clientsocket1.active всегда true. Решил убрать clientsocket1.open при создании формы. И помогло! :) Спасибо за идею!


SergP   (2003-08-17 17:55:00) [2]

Вообще-то пусть мастера ответят. А то возможно я что-нить не правильно скажу. Но мне кажется что после

clientsocket1.Close;

Нужно подождать пока clientsocket отконектится.

Поэкспериментируй с ожиданием пока не установится в false Clientsocket1.active или Clientsocket.socket.connected
Насчет того ждать первое или второе - поэкспериментируй сам.


Mr.Bean   (2003-08-17 16:55:00) [3]

Нет, извиняюсь. Эта проблема решена. Я делал чуть-чуть по другому
var
i,k:integer;
c:string;
begin
if serversocket1.Active=false then exit;
k:=0;
c:="add!";
while listbox1.Items[k]<>"" do
c:=c+listbox1.Items[k]+"!";
for i:=0 to serversocket1.socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText(c);
Теперь другая проблема. При создании формы вызывается событие clientsocket1.open. Для возможности изменения IP сервера я делаю код:
clientsocket1.Close;
clientsocket1.host:=form2.edit2.text;
clientsocket1.port:=StrToInt(form2.Edit3.text);
clientsocket1.open
И программа выдает сообщение "Can"t change value while socket is active". Как от этого избавиться?


Mr.Bean   (2003-08-17 16:29:00) [4]

Я тоже так сделал. Но я сделал это в таймере. При попытке клиента присоединиться к серверу выдает сообщение об ошибке. А суть проблемы ты понял правильно.


SergP   (2003-08-17 15:02:00) [5]

Так а в чем именно проблема?
Рассылай listbox.Items.Text всем подключеным клиентам.

Ну например так:

var
a:string;
i:integer;
begin
a:="#1"+listbox1.Items.Text;
// #1 - некая строка позволяющая клиенту
// отличить список абонентов от других данных

for i:=0 to serversocket1.Socket.ActiveConnections-1 do
begin
ServerSocket1.Socket.Connections[i].SendText(a);
end;
end.

Не знаю насколько это правильно. Я сам с сокетами начал работать несколько дней назад (чаты не писал). Но думаю что я бы сделал так или подобным образом. Если конечно я правильно понял суть проблемы....


Наверх

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