Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Isya Shmonder
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 21
1

Клиент-сервер: клиент требует повторно сгенерировать массив

05.11.2011, 13:44. Просмотров 2623. Ответов 1
Метки нет (Все метки)

Здравствуйте, есть программы клиент и сервер, клиент после требуемого ввода IP, пароля и генерации элементов массива всё равно требует сгенерировать массив. В чём может быть проблема?

Модуль клиент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
unit ClientUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock, ScktComp, Grids;
 
type
  TClientForm = class(TForm)
    ServerIP: TEdit;
    Label3: TLabel;
    Connecting: TButton;
    Label2: TLabel;
    Password: TEdit;
    SendPassword: TButton;
    Client: TClientSocket;
    Server: TServerSocket;
    Generate: TButton;
    Matrix: TStringGrid;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ConnectingClick(Sender: TObject);
    procedure SendPasswordClick(Sender: TObject);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure GenerateClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  ClientForm: TClientForm;
  Connected,Sent:boolean;
  u:integer;
 
implementation
 
{$SETPEFlAGS IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_DEBUG_STRIPPED or
  IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED or
  IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP}
{$IF CompilerVersion >= 21.0}
  {$WEAKLINKRTTI ON}
  {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}
 
{$R *.dfm}
 
function GetLocalIP: String;
const WSVer = $101;
var wsaData: TWSAData; P: PHostEnt; Buf: array [0..127] of Char;
begin
 Result := '';
 if WSAStartup(WSVer, wsaData)=0 then
  begin
   if GetHostName(@Buf, 128)=0 then
    begin
     P:=GetHostByName(@Buf);
     if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
    end;
   WSACleanup;
  end;
end;
 
procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 //закрываем сессию отсылки
 if Connected=True then
  begin
   Connecting.Perform(WM_LBUTTONDOWN, 0, 0);
   Connecting.Perform(WM_LBUTTONUP, 0, 0);
   Client.Socket.SendText('Bye.');
   Client.Active:=False;
  end;
end;
 
procedure TClientForm.FormShow(Sender: TObject);
begin
 Connected:=False;
end;
 
procedure TClientForm.GenerateClick(Sender: TObject);
label Mistake;
var i:integer; Number:string;
begin
 u:=0;
 if not InputQuery('Введите размерность массива:','в диапазоне от 0 до 99', Number) then Number:='';
 if (Number='') then
  begin
   ShowMessage('Введите размерность массива!');
   goto Mistake;
  end;
 Matrix.RowCount:=strtoint(Number);
 for i:=0 to strtoint(Number)-1 do
  begin
   randomize;
   Matrix.Cells[0,i]:=IntTostr(random(100));
  end;
 Matrix.Hint:='Сгенерирован.';
 Mistake:
end;
 
procedure TClientForm.ConnectingClick(Sender: TObject);
begin
 if Matrix.Hint='Массив сгенерирован.' then
  begin
   //если поле ввода для пароля не пусто
   if Password.Text<>'' then
    begin
     //если поле ввода для IP сервера не пусто
     if ServerIP.Text<>'' then
      begin
      //тогда подготовим клиент для оправления сообщения
      Client.Address:=ServerIP.Text;
      Client.Open;
      if Connected=True then ShowMessage('Подготовка к отсоединению прошла успешно!') else
      ShowMessage('Подготовка к соединению прошла успешно!');
      Connected:=True;
     end else ShowMessage('Введите IP-адрес сервера!');
   end else ShowMessage('Введите пароль!');
  end else ShowMessage('Сгенерируйте элементы массива!');
end;
 
procedure TClientForm.SendPasswordClick(Sender: TObject);
var temp:string; i:integer;
begin
 ServerIP.ReadOnly:=True;
 Password.ReadOnly:=True;
 //нажимаем программно на кнопку подготовки к соединению
 Connecting.Perform(WM_LBUTTONDOWN, 0, 0);
 Connecting.Perform(WM_LBUTTONUP, 0, 0);
 //если всё удачно, то продолжим
 if Connected=True then
  begin
   //отображаем состояние клиента
   Sleep(400);
   //отсылаем сообщение
   Client.Socket.SendText(GetLocalIP+'>'+Password.Text);
   //закрываем сессию отсылки
   Sleep(400);
   //открываем сессию принятия сообщения
   Server.Active:=True;
   Server.Open;
  end;
end;
 
procedure TClientForm.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var temp,Received:string; i,j:integer;
begin
 Received:=Socket.ReceiveText;
 //могут быть 3 вида сообщений
 //об ошибке и
 //что всё путём и надо послать массив
 //и принять массив
 //если у нас сообщение об ошибке, то покажем ошибку
 if Received[1]='&' then
  begin
   ShowMessage('Пользователя с таким паролем не существует! В обработке данных отказано.');
   Sleep(400);
  end
 //иначе всё путём
 else
  begin
   //посылаем массив
   if Sent=False then
   //посылаем массив
    begin
     temp:=IntToStr(Matrix.RowCount)+';';
     for i:=0 to Matrix.RowCount-1 do if i<>0 then temp:=temp+':'+Matrix.Cells[0,i] else temp:=temp+Matrix.Cells[0,i];
     temp:=temp+':';
     Client.Socket.SendText(temp);
     Sent:=True;
    end
   else
   //принимаем массив
    begin
     //2;31:2
     j:=0;
     temp:='';
     //это значения элементов
     for i:=0 to length(Received) do if Received[i]<>':' then temp:=temp+Received[i] else
      begin
       if j<Matrix.RowCount then Matrix.Cells[0,j]:=temp;
       inc(j);
       temp:='';
      end;
     Caption:='Принят отсортированный массив.';
     Sent:=False;
    end;
  end;
end;
 
end.
Модуль сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
unit ServerUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, Winsock, ExtCtrls, Grids;
 
type
  TServerForm = class(TForm)
    Server: TServerSocket;
    Client: TClientSocket;
    Button1: TButton;
    Button2: TButton;
    ToAdress: TEdit;
    Infor: TEdit;
    Console: TMemo;
    Matrix: TStringGrid;
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormShow(Sender: TObject);
    procedure CheckPassword(Received:string);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
  end;
 
var
  ServerForm: TServerForm;
  Counted:integer;
 
implementation
 
{$SETPEFlAGS IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_DEBUG_STRIPPED or
  IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED or
  IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP}
{$IF CompilerVersion >= 21.0}
  {$WEAKLINKRTTI ON}
  {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}
 
{$R *.dfm}
 
 
procedure TServerForm.FormShow(Sender: TObject);
begin
 Caption:=Application.EXEName;
 Server.Active:=True; // активируем сервер
 Server.Open; //запускаем
 Console.Lines.Add('Сервер запущен.');
end;
 
procedure TServerForm.Button1Click(Sender: TObject);
begin
 Client.Address:=ToAdress.Text;
 Client.Active:=True;
 Client.Open;
end;
 
procedure TServerForm.Button2Click(Sender: TObject);
begin
 Client.Socket.SendText(Infor.Text);
 Client.Active:=False;
end;
 
procedure TServerForm.CheckPassword(Received:string);
label Faster;
var AdressToSendBack,Password,whole,Info,pass,Answer:string; i,stopped:integer; Base:textfile;
begin
 //получили сообщение - разделяем его на 2 части
 //адрес ответа
 AdressToSendBack:='';
 stopped:=0;
 for i:=1 to length(Received) do if Received[i]<>'>' then AdressToSendBack:=AdressToSendBack+Received[i] else
  begin
   stopped:=i+1;
   break;
  end;
 if AdressToSendBack='' then
  begin
   Console.Lines.Add('Ошибка данных! Не могу извлечь адрес подключившегося клиента.');
   goto Faster;
  end;
 Sleep(200);
 //и пароль
 Password:='';
 for i:=stopped to length(Received) do Password:=Password+Received[i];
 if Password='' then
  begin
   Console.Lines.Add('Ошибка данных! Не могу извлечь пароль из принимаемого сообщения.');
   goto Faster;
  end;
 Sleep(200);
 Console.Lines.Add('От клиента '+AdressToSendBack+' получен пароль '+Password+'.');
 //ищем в базе данных принятый пароль
 AssignFile(Base,'base.scd');
 Reset(Base);
 stopped:=0;
 while not eof(Base) do
 begin
  readln(Base,whole);
  pass:='';
  for i:=1 to length(whole) do if whole[i]<>'>' then pass:=pass+whole[i] else break;
  //нашли пароль
  if Password=pass then
   begin
    for i:=1 to length(whole) do if whole[i]='>' then
     begin
      stopped:=i+1;
      break;
     end;
    //и отправим её
    Client.Address:=AdressToSendBack;
    Client.Active:=True;
    Client.Open;
    Console.Lines.Add('Отправляю добро клиенту на работу с сервером '+AdressToSendBack+'.');
    ShowMessage('Подождите, идёт процесс...');
    Client.Socket.SendText('Действуй!');
    goto Faster;
   end;
 end;
 //не нашли пароля
 Sleep(200);
 Console.Lines.Add('Такого пароля в базе данных не обнаружено.');
 Client.Address:=AdressToSendBack;
 Client.Active:=True;
 //Client.Open;
 Sleep(300);
 Console.Lines.Add('Отправляю отказ клиенту '+AdressToSendBack+'.');
 ShowMessage('Подождите, процесс идёт...');
 //отправим отказ
 Client.Socket.SendText('&');
 Faster:
end;
 
procedure TServerForm.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var something,temp:string; i,j,stopped:integer;
begin
 something:=Socket.ReceiveText;
 //если принятая информация - конец сессии
 if something='Bye.' then
  begin
   Console.Lines.Add('Инициируется отключение клиента...');
   Server.Active:=False;
   Server.Close;
   Server.Active:=True;
   Server.Open;
   Counted:=0;
  end
 else
  //принимаем пароль от клиента
  if Pos('>',something)<>0 then
   begin
    Console.Lines.Add('Инициируется подключение клиента...');
    Sleep(300);
    CheckPassword(something);
   end
  else
  //принимаем массив
  begin
   //2;31:2
   temp:='';
   //это количество элементов
   for i:=1 to length(something) do if something[i]<>';' then temp:=temp+something[i] else
    begin
     stopped:=i;
     break;
    end;
   Matrix.RowCount:=StrToInt(temp);
   j:=0;
   temp:='';
   //это значения элементов
   for i:=stopped+1 to length(something) do if something[i]<>':' then temp:=temp+something[i] else
    begin
     if j<Matrix.RowCount then Matrix.Cells[0,j]:=temp;
     inc(j);
     temp:='';
    end;
   //упорядочим принятый массив
   for i:=0 to Matrix.RowCount-1 do
   for j:=0 to Matrix.RowCount-1 do
    if (i<>j) and (Matrix.Cells[0,j]<>'') and (Matrix.Cells[0,i]<>'') then if StrToInt(Matrix.Cells[0,j])<StrToInt(Matrix.Cells[0,i]) then
     begin
      temp:=Matrix.Cells[0,j];
      Matrix.Cells[0,j]:=Matrix.Cells[0,i];
      Matrix.Cells[0,i]:=temp;
     end;
   //отсылаем массив обратно
   for i:=0 to Matrix.RowCount-1 do if i<>0 then temp:=temp+':'+Matrix.Cells[0,i] else temp:=Matrix.Cells[0,i];
   temp:=temp+':';
   Client.Socket.SendText(temp);
  end;
end;
 
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2011, 13:44
Ответы с готовыми решениями:

Клиент-сервер
Есть сервер, он же подключен к БД... так же имеются клиенты, которые...

Клиент сервер
Всем привет, помогите с написанием клиент серверного приложения, задача 1...

клиент - сервер
делал урок: _http://www.fssr.ru/hz.php?name=News&amp;file=article&amp;sid=7983 но...

Клиент Сервер SendBuf и Integer
Доброго времени суток, облазил форум, поиск делал но так и не нашел как...

Командный интерфейс взаимодействия Клиент - Сервер
Есть клиент и сервер написанные с использованием ServerSocket и ClientSocket и...

1
Vega251
378 / 95 / 3
Регистрация: 07.09.2011
Сообщений: 519
Записей в блоге: 2
05.11.2011, 13:48 2
А почему вы паскалевский (в нотации Lazarus) код засунули в ветку с С++?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2011, 13:48

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

Клиент и сервер для Delphi XE3
На XE3 нет некоторых функций (может есть, но по другому называются)... помогите...

Клиент/Сервер, LNet и передача/получение JSON
1. Есть сервер и клиент написанные с использованием компонента LNet, мне не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru