Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 21:06   #1
ISPO
Пользователь
 
Регистрация: 17.04.2012
Сообщений: 16
Лампочка Проблемка в чате...С онлайн-списком

Вообщем кодю чат,так вот возникла проблемка с ПРАВИЛЬНЫМ отображением онлайна...(сколько мучаюсь ну никак не могу разобраться в чем причина...вот,во вложении есть настроенный чат на локалку,запустите несколько клиентов с разными именами и посмотрите,что получается( пощелкайте подключиться\отключиться....Вот,оче нь нужна ваша помощь,собственно вот код модулей,отвечающих за обмен между сервером и клиентом.
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var  //задаем переменную хранения сообшения!
  i: integer; //переменная счетчик
   sob:string;
begin
soob:= socket.ReceiveText;
//читаем, то что нам прислал клиент
if (copy(soob,1,2) <> '') and (copy(soob,1,2)='so') then
begin
delete(soob,1,2);
memo1.Lines.Add(soob);
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
 ServerSocket1.Socket.Connections[i].SendText('ob'+soob);
end;
{Проверка на пришедшее имя юзера}
  if Copy(soob,1,2) = 'mi' then begin
   Delete(soob,1,2);
   {Добавляем его в юзер лист}
   ListBox1.Items.Add(soob);
   sob := 'us';
   {Если кто-то прислал нам свое имя}
   for i := 0 to ListBox1.Items.Count-1 do
    soob := sob+ListBox1.Items[i]+';';
   { рассылаем список юзеров всем клиентам}
   for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
    ServerSocket1.Socket.Connections[i].SendText(soob);
   Exit;
 end;

end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  i:integer;
begin
kolvo:=serversocket1.Socket.ActiveConnections;

  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
   ServerSocket1.Socket.Connections[i].SendText('zi');
   listbox1.Items.Clear;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
    var
     sob:string;
  i:integer;
begin
kolvo:=serversocket1.Socket.ActiveConnections-1;
  {Если кто-то присоединился или отсоединился,то посылаем запрос на новый список логинов}
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
   ServerSocket1.Socket.Connections[i].SendText('zi');
   listbox1.Items.Clear;
- Это серверная часть!


Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
  var spis: string; //переменная списка юзеров! Логика в проверки первых 2ух символов
begin                             //проверяем есть ли сообщение и вводим егов мемо
//Memo1.Lines.Add(socket.ReceiveText);
coxpan:=memo1.Text;

{-----------Блок определения Логина(On-line)-----------}
spis:=socket.ReceiveText;
{ playsound('msg.wav',0,SND_ASYNC);  //воспроизводит файл в режиме асинхронизации  исправить методом онChange}
if copy(spis,1,2)='ob' then
begin
delete(spis,1,2);
Memo1.Lines.Add(spis);
end;
if copy(spis,1,2)='us' then
begin
delete(spis,1,2); //удаляем первые два привязанных символа
listbox1.Items.Clear;

   while Pos(';',spis) > 0 do begin  //Добавляем по 1 юзеру в список Он-лайна.Имена поделены ;
    ListBox1.Items.Add(Copy(spis,1,Pos(';',spis)-1));
    Delete(spis,1,Pos(';',spis));
end;
 exit;
end;
{-----------Конец определения логина-----------}


{-----------Запрос логина юзера-----------}
 if Copy(spis,1,2) = 'zi' then begin  //запрос сервера на посылку логина

   Socket.SendText('mi'+loger); //ответ на запрос логина
   Exit;
  end;
{----------Конец запроса логина-----------}
end;
- Это с клиентской стороны реализация выше описанной функции...ОЧЕНЬ НАДЕЮСЬ НА ВАШУ ПОМОЩЬ ребята!
Вложения
Тип файла: rar CLIENT-SERVER.rar (353.3 Кб, 12 просмотров)
ISPO вне форума Ответить с цитированием
Старый 18.04.2012, 13:25   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

А отображение онлайна где на сервере или в клиенте проблема?
Если в сервере зачем тебе запрос на лист делать просто из списка удали index который вернет отключенный сокет
Попробуй сделай так
Код:
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
if ListBox1.Items.Count >= Socket.Index then
   ListBox1.Items.Delete(Socket.Index);
end;

Последний раз редактировалось Aliens_wolfs; 18.04.2012 в 13:59.
Aliens_wolfs вне форума Ответить с цитированием
Старый 18.04.2012, 13:59   #3
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

А не тут ли ошибка:

Код:
 for i := 0 to ListBox1.Items.Count-1 do
    soob := sob+ListBox1.Items[i]+';';
Вместо sob может нужен soob?
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 18.04.2012, 14:04   #4
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

Точнее, начиная отсюда наверное, вот так правильнее:
Код:
soob := 'us';
   {Если кто-то прислал нам свое имя}
   for i := 0 to ListBox1.Items.Count-1 do
    soob := soob+ListBox1.Items[i]+';';
Насколько я поняла тут вы в цикле добавляете все имена из листбокса. И потом все эти имена посылаете всем юзерам.
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 18.04.2012, 14:10   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Был бы исходник было бы проще исправить

Последний раз редактировалось Aliens_wolfs; 18.04.2012 в 14:15.
Aliens_wolfs вне форума Ответить с цитированием
Старый 18.04.2012, 15:11   #6
ISPO
Пользователь
 
Регистрация: 17.04.2012
Сообщений: 16
По умолчанию

Да,исходник сейчас выложу...
ISPO вне форума Ответить с цитированием
Старый 18.04.2012, 15:13   #7
ISPO
Пользователь
 
Регистрация: 17.04.2012
Сообщений: 16
По умолчанию

вот собственно он,я там тоже думал,что ошибка,я в sob,сперва было soob,все как положено то есть)потом просто решил создать отдельную переменную,думал,вдруг поможет?но не помогло(
Вложения
Тип файла: rar Client+Server.rar (1.19 Мб, 11 просмотров)
ISPO вне форума Ответить с цитированием
Старый 18.04.2012, 15:17   #8
ISPO
Пользователь
 
Регистрация: 17.04.2012
Сообщений: 16
По умолчанию

if ListBox1.Items.Count >= Socket.Index then
ListBox1.Items.Delete(Socket.Index) ;
end;
Socket.Index - конкретно это он вообще не распознает.
ISPO вне форума Ответить с цитированием
Старый 18.04.2012, 15:47   #9
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

Цитата:
Сообщение от ISPO Посмотреть сообщение
вот собственно он,я там тоже думал,что ошибка,я в sob,сперва было soob,все как положено то есть)потом просто решил создать отдельную переменную,думал,вдруг поможет?но не помогло(
У тебя 2 процедуры, в которых эти переменные описаны.
Так вот в
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
я поменяла, как указывала в своём посте выше - теперь правильно отображает список клиентов.

А ещё у тебя есть таймер, где как бы тоже самое обрабатывается . Но таймер видимо не вызвается или ещё что, не смотрела.
Вложения
Тип файла: rar New folder (2).rar (330.6 Кб, 23 просмотров)
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 18.04.2012, 16:01   #10
ISPO
Пользователь
 
Регистрация: 17.04.2012
Сообщений: 16
По умолчанию

спасибо,вроде бы работает,но там еще проблемка мелкая есть,он префик "us" почему-то произвольно добавляет) сам и заносит ник,который есть уже в сети в листбокс,но с префиксом us,вот если можете,потыкайте отключиться подключиться несколько раз,с двух клиентов и поймете о чем речь.Заранее спасибо,есил подскажете в чем там трабла.
ISPO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смайлы в чате (TRichView) fewcher Помощь студентам 1 05.06.2011 09:23
Оформление в чате mish@ Общие вопросы Delphi 5 01.03.2010 21:45
Skroll box в чате. Dj_smart Общие вопросы Delphi 9 08.03.2008 09:34
Смайлы в чате. Teen4jump Общие вопросы Delphi 5 05.03.2008 21:20