![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пишу свой чат. Помогите! [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.
Не знаю насколько это правильно. Я сам с сокетами начал работать несколько дней назад (чаты не писал). Но думаю что я бы сделал так или подобным образом. Если конечно я правильно понял суть проблемы....