Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Проблема с dclSockets


Автор: Coderr 13.7.2006, 17:49
Я пишу прогу, состоящую из клиента и сервера, передача данных в которой происходит посредством 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 раз! как от этого избавиться или это всё из-за то, что я запускаю на одном компе? 

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

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


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

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


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

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

  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)