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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с dclSockets, Передача текста 
:(
    Опции темы
Coderr
  Дата 13.7.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я пишу прогу, состоящую из клиента и сервера, передача данных в которой происходит посредством dclSockets. 

Вот отрывок кода клиента:

Код

procedure TLoginForm.CheckButtonClick(Sender: TObject);
begin
 if LoginEdit.Text<>'' then begin
  Server.Active:=true;
  Client.Active:=true;
  Client.Socket.SendText('/check '+LoginEdit.Text);
  Client.Active:=false
 end
end;

procedure TLoginForm.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var s:string;
begin
 s:=Socket.ReceiveText;
 if s='/check y' then begin
  Label6.Font.Color:=clRed;
  Label6.Caption:='Ник занят'
 end
 else begin
  Label6.Font.Color:=clGreen;
  Label6.Caption:='Ник свободен'
 end
end;


Вот отрывок кода сервера:

Код

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var s,command,appendix:string;
    i:integer;
    b:bool;
begin
 s:=Socket.ReceiveText;
 command:=copy(s,1,pos(' ',s)-1);
 delete(s,1,pos(' ',s));
 appendix:=s;
 {-----------/check------------}
 if command='/check' then begin
  b:=false;
  for i:=0 to ListView.Items.Count-1 do
   if ListView.Items[i].Caption=appendix then begin
    b:=true;
    break
   end;
  ClientSocket.Active:=true;
  if b then ClientSocket.Socket.SendText('/check y')
  else ClientSocket.Socket.SendText('/check n');
  ClientSocket.Active:=false
 end
 {-----------/check------------}
end;


Смысл такой:
В окне клиента есть Edit, в который вводится логин и кнопочка, при нажатии на которую происходит отправка запроса на сервер такого вида: 
Код

 '/check '+'логин'

сервер должен получить этот запрос и проверить в ListView с логинами(это работает отменно. ПРОВЕРЕНО! smile ) наличие или отсутствие данного логина, после чего сервер высылает клиенту следующий текст: 
Цитата

 '/check y' - логин существует;
 '/check n' - логин несуществует

существование или отсутствие выводится в Label6 клиента. Вроде бы всё хорошо, НО! Я решил проверить работоспособность на своём компе, то есть запустил клиент и сервер одновременно, при этом указал следующие настройки в режиме конструктора:
 1) КЛИЕНТ:
  1.1) КлиентСокет:
  Хост: 10.15.6.57;
  Порт: 2024;
  1.2) СерверСокет:
  Порт: 2025;
 2) СЕРВЕР:
  2.1) КлиентСокет:
  Хост: 10.15.6.57;
  Порт: 2025;
  2.2) СерверСокет:
  Порт: 2024;
Но чтобы узреть наличие или отсутствие логина нада кнопку нажать быстро от двух до 5 раз! как от этого избавиться или это всё из-за то, что я запускаю на одном компе? 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Matematik
Дата 13.7.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

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



Ни разу не видел dclSockets, но есть подозрение что сокет в неблокирующем режиме
Код

Client.Active:=true;
// не ждет пока соединится, и пытается в закрытый сокет отправить текст
Client.Socket.SendText('/check '+LoginEdit.Text);
Client.Active:=false


Хотя телепат из меня плохой  smile   

Это сообщение отредактировал(а) Matematik - 13.7.2006, 19:07
PM MAIL WWW ICQ   Вверх
Coderr
Дата 13.7.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Matematik @  13.7.2006,  18:50 Найти цитируемый пост)
азу не видел dclSockets, но есть подозрение что сокет в неблокирующем режиме


ТО есть нада прописать что-то типа этого:
Код

Client.Active:=true;
if Client.connected then
 Client.Socket.SendText('/check '+LoginEdit.Text);
Client.Active:=false

  

Это сообщение отредактировал(а) Coderr - 13.7.2006, 20:29
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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