Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чат на Delphi, помогит с определением сообщения 
:(
    Опции темы
InseR
Дата 14.4.2008, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Я пишу чат на Delphi(использую сокеты).Предполагается,что чат должен иметь ListBox для вывода пользователей и Memo для вывода сообщений(приватные сообщения пока что не планируются).Так вот,когда я дошел до того момента,когда надо было реализовать список пользователей,то решил сделать такую систему:При соединении с сервером,клиент сразу же отправляет свой ник вида ('#N'+nickname),сервер,получив данные делает проверку и если первые 2 символа = '#N', то эти символы удаляются,потом nickaname добавляется в ListBox на сервере,потом в начало добавляется '#U',а потом начинается цикл получения всех пользователей с сервера и отправка в цикле этих данных на все подключенные программы-клиенты.Клиенты,получив сообщение проверяют,если первые два символа равны = '#U', то отсекают это самое '#U' и начинают цикл добавления пользователей в ListBox.Простые сообщения отсылаются по такому же принципу,но с пометкой '#M'.Если просто реализовать отправку сообщений через '#M',то все идет нормально,а вот если добавить код,отвечающий за формирование списка пользователей,то неработает ни отправка сообщений,ни собственно и формирование списка пользователей.Помогите пожалуйста решить проблему. smile 
Вот фрагмент кода с сервера и клиента:
Сервер:
Код

var
text:string;
user:integer;
begin

if ServerSocket.Socket.ActiveConnections = 0 then
exit;
if (ServerSocket.Socket.ActiveConnections <> 0) and (ServerSocket.Socket.ActiveConnections <> 1) then
begin

 for i:=1 to ServerSocket.Socket.ActiveConnections do
 text:=ServerSocket.Socket.Connections[i].ReceiveText();

 if copy(text,1,2) = '#M' then
 begin
 for j:=1 to ServerSocket.Socket.ActiveConnections do
 ServerSocket.Socket.Connections[j].SendText(text);
 end;

 if copy(text,1,2) = '#N' then
 begin
 Delete(text,1,2);
 UserList.Items.Add(text);
 text:='#U';
 for user:=0 to UserList.Items.Count-1 do
 text:=text+UserList.Items[user]+';';
 for  j:=1 to ServerSocket.Socket.ActiveConnections do
 ServerSocket.Socket.Connections[j].SendText(text);
 end;







 end
else


if ServerSocket.Socket.ActiveConnections = 1 then
begin
 text:=ServerSocket.Socket.Connections[0].ReceiveText();

  if Copy(text,1,2) = '#M' then
  begin
  Delete(text,1,2);
  ServerSocket.Socket.Connections[0].SendText(text);
  end;

  if copy(text,1,2) = '#N' then
 begin
 Delete(text,1,2);
 UserList.Items.Add(text);
 text:='#U';
 for user:=0 to UserList.Items.Count-1 do
 text:=text+UserList.Items[user]+';';
 ServerSocket.Socket.Connections[0].SendText(text);
 end;




 end;


end;



Клиент:
Код

var
  text:string;
  begin
 text:=Socket.ReceiveText();

 if Copy(text,1,2) = '#M' then
 begin
 Delete(text,1,2);
 MessageMemo.Lines.add(text);
 end;

 if Copy(text,1,2) = '#U' then
 begin
 Delete(text,1,2);
 UserList.Clear;
 while Pos(';',text) > 0 do
 begin
 UserList.Items.Add(Copy(text,1,Pos(';',text)-1));
 Delete(text,1,Pos(';',text));
 end;
 end;



PM MAIL   Вверх
MetalFan
Дата 14.4.2008, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(InseR @  14.4.2008,  06:41 Найти цитируемый пост)
if ServerSocket.Socket.ActiveConnections = 0 then
exit;
if (ServerSocket.Socket.ActiveConnections <> 0)

масло маслянное?

Цитата(InseR @  14.4.2008,  06:41 Найти цитируемый пост)
 for i:=1 to ServerSocket.Socket.ActiveConnections do

нумерация элементов в списке идет с нуля и заканчивается Count-1.




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
InseR
Дата 14.4.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Код переписал,простые сообщения работают нормально,а вот с формированием списка ников по прежнему проблемы.

Процедура соединения с сервером:
Код

procedure TOptionsForm.ClientBtnClick(Sender: TObject);
begin
if ClientBtn.Tag = 0 then
 begin
 MainForm.ClientSocket.Port:=StrToInt(PortEdit.Text);
 MainForm.ClientSocket.Host:=HostEdit.Text;
 MainForm.ClientSocket.Address:=HostEdit.Text;
 MainForm.ClientSocket.Active:=true; // Подключение к серверу
 MainForm.ClientSocket.Socket.SendText('#N'+nickedit.Text); // Отправка сообщения с никои '#N'
 ClientBtn.Tag:=1;
 ClientBtn.Caption:='Отключиться';
 end


Процедура прослушывания каналов на сервере(используется Timer):
Код

procedure TMainForm.ServerTimerTimer(Sender: TObject);
var
text:string;
user:integer;
begin

if ServerSocket.Socket.ActiveConnections = 0 then
exit
else
begin

 for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
 text:=ServerSocket.Socket.Connections[i].ReceiveText();

 if copy(text,1,2) = '#M' then
 begin
 for j:=0 to ServerSocket.Socket.ActiveConnections-1 do
 ServerSocket.Socket.Connections[j].SendText(text);
 end;

 if copy(text,1,2) = '#N' then // если первыу 2 символа '#N', то .........
 begin
 Delete(text,1,2);
 UserList.Items.Add(text);
 text:='#U';
 for user:=0 to UserList.Items.Count-1 do
 text:=text+UserList.Items[user]+';';
 for  j:=0 to ServerSocket.Socket.ActiveConnections-1 do
 ServerSocket.Socket.Connections[j].SendText(text);
 end;

end
end;




И наконец процедура принятия сообщений от сервера:
Код

procedure TMainForm.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  text:string;
  begin
 text:=Socket.ReceiveText();

 if Copy(text,1,2) = '#M' then
 begin
 Delete(text,1,2);
 MessageMemo.Lines.add(text);
 end;

 if Copy(text,1,2) = '#U' then // если первые два символа '#U', то.........
 begin
 Delete(text,1,2);
 UserList.Clear;
 while Pos(';',text) > 0 do
 begin
 UserList.Items.Add(Copy(text,1,Pos(';',text)));
 Delete(text,1,Pos(';',text));
 end;
 end;
end;


Проблема только в  формировании списка пользователей.Из кода видна попытка реализации:
1 При подключении,клиент шлет свой ник и идентификатор '#N'.
2 Получая сообщение,сервер обрабатывает его и если находит в строке первые два символа вида '#N', то удаляет их,добавляет пользователя в ListBox,затем формирует цикл и отправляет данные клиентам с пометкой '#U'.
3 Приняв данные,клиент ищет пометку '#U' и если находит,то формирует свой ListBox.

Почему то данный алгоритм не работает.Помогите плиз. smile 


Это сообщение отредактировал(а) InseR - 14.4.2008, 10:33
PM MAIL   Вверх
MetalFan
Дата 14.4.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(InseR @  14.4.2008,  10:32 Найти цитируемый пост)
Почему то данный алгоритм не работает.

и каков признак его неработоспособности?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
InseR
Дата 14.4.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(MetalFan @ 14.4.2008,  10:56)
Цитата(InseR @  14.4.2008,  10:32 Найти цитируемый пост)
Почему то данный алгоритм не работает.

и каков признак его неработоспособности?

В том,что список пользователей не отображается ни на сервере,ни у клиента.
PM MAIL   Вверх
MetalFan
Дата 14.4.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



и что говорит отладчик?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
InseR
Дата 15.4.2008, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Вообщем я думаю проблема в этом участке кода:
Код

UserList.Clear;
 while Pos(';',text) > 0 do
 begin
 UserList.Items.Add(Copy(text,1,Pos(';',text)));
 Delete(text,1,Pos(';',text));


Но вот как именно его переписать незнаю...
PM MAIL   Вверх
InseR
Дата 15.4.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Проблему устранил.....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1409 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.