Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
1

Асинхронный текст клиента и сервера

02.05.2014, 15:54. Показов 1823. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем Доброго времени суток. На сервере текст отображается по-одному, на клиенте по другому. Где может быть ошибка?

Текст, который отображается в клиенте:
[System Process]
[System Process]
System
[System Process]
System
smss.exe
[System Process]
System
smss.exe
csrss.exe
[System Process]
System
smss.exe
csrss.exe
csrss.exe
[System Process]
System
smss.exe
csrss.exe
csrss.exe
wininit.exe
[System Process]
System
smss.exe
csrss.exe

Текст, который отображается на сервере.
[System Process]
System
smss.exe
csrss.exe
csrss.exe
wininit.exe
winlogon.exe
services.exe
lsass.exe
lsm.exe
svchost.exe
nvvsvc.exe
svchost.exe
...............................
PowerDVD13Agent.exe
ccsvchst.exe
NvNetworkService.exe
nvstreamsvc.exe
WCScheduler.exe
ccsvchst.exe

Код сервера:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 l:=Pos('get process',s);
if l<>0 then
begin
result:=TStringList.Create;
FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FP.dwSize:=Sizeof(FP);
Co:=Process32First(FS,FP);
while integer(Co) <> 0 do
begin
result.Add(FP.szExeFile);
Co:=Process32Next(FS,FP);
end;
CloseHandle(FS);
Memo2.Clear;
for i := 0 to result.Count-1 do
begin
Memo2.Lines.Add(result[i]);
AContext.Connection.Socket.Write(Memo2.Text);
Код клиента:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
i:integer;
begin
 if idTcpClient1.Connected  then
  begin
   idTcpClient1.Socket.WriteLn(edit2.text);
   memo1.Lines.Add('['+Timetostr(time)+'] '+'Команда "'+ edit2.Text + '" послана серверу!');
   if edit2.Text='get process' then
  begin
  for i := 1 to 25 do
   Memo1.lines.add(IdTCPClient1.Socket.ReadLn);
 end
  end
else memo1.Lines.Add('['+Timetostr(time)+'] '+'Вы не подключены к серверу!');
end;
Еще не получается в клиенте показать точно все процессы, если в цикле от 1 до n, поставить то клиент виснет. Может попробовать определять количество процессов на сервере и отсылать это число клиенту, а клиент до этого числа и будет запускать цикл?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2014, 15:54
Ответы с готовыми решениями:

Соединение клиента и сервера
Пожалуйста, помогите! Не знаю, что уж и делать... Сделал клиент-серверный шаблон по примеру из...

Как мониторить подключения и отключения клиента от сервера?
Есть клиент серверное приложение с использованием TcpServer и TcpClient, как можно регистрировать...

Зависание клиента при получении сообщения от сервера
Отсылаю сообщение серверу и хочу вывести результат выполнения команды на сервере в клиенте. Клиент...

SocketServer & SocketClient, не отправляет текст с клиента на сервер
Помогите с проблемой. Есть сокет клиент и сокет сервер. С сервера на клиент сообщение нормально...

15
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.05.2014, 22:11 2
От какой балды тут появилась "асинхронность" ?
Ни малейшего намека на нее, даже близко не пахнет.
0
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
04.05.2014, 15:34  [ТС] 3
mss, согласен термин "асинхронность" к данной проблеме употребил неверно. Что в данном случае можно сделать? Почему код в клиенте не такой как на сервере?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
04.05.2014, 21:50 4
Лучший ответ Сообщение было отмечено NOVICHOK2012 как решение

Решение

Потому что вызов метода AContext.Connection.Socket.Write(Memo2.Text) у тебя повторяется result.Count раз
1
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
04.05.2014, 22:05  [ТС] 5
mss, большое спасибо. Оказывается надо было прописать end после
Delphi
1
Memo2.Lines.Add(result[i]);
и перед
Delphi
1
AContext.Connection.Socket.Write(Memo2.Text);
Еще не получается в клиенте показать точно все процессы, если в цикле от 1 до n, поставить то клиент виснет. Может попробовать определять количество процессов на сервере и отсылать это число клиенту, а клиент до этого числа и будет запускать цикл?
А как с этим поступить? Хотелось бы, чтобы весь текст, который на сервере передавался клиенту и в клиенте не надо было нажимать 100 раз кнопку. Если выполнить этот цикл, где i больше 30, то ПК зависает.
Delphi
1
2
for i := 1 to 25 do
   Memo1.lines.add(IdTCPClient1.Socket.ReadLn);
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
04.05.2014, 22:14 6
Самый простой вариант - на стороне передатчика сохранить стринглист в стрим и передать его методом WriteStream, а на стороне приемника получить стрим вызовом ReadStream и загрузить стринглист из полученного стрима
1
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
04.05.2014, 23:57  [ТС] 7
mss, что-то не получается.

Клиент:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
Stream: TMemoryStream;
begin
 if idTcpClient1.Connected  then
  begin
   idTcpClient1.Socket.WriteLn(edit2.text);
   memo1.Lines.Add('['+Timetostr(time)+'] '+'Команда "'+ edit2.Text + '" послана серверу!');
    IdTCPClient1.IOHandler.ReadStream(Stream);
    Memo1.Lines.LoadFromStream(Stream);
  end
else memo1.Lines.Add('['+Timetostr(time)+'] '+'Вы не подключены к серверу!');
end;
Сервер:
Delphi
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
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
result:Tstringlist;
stream:TMemoryStream;
l:integer;
begin
l:=Pos('get process',s);
if l<>0 then
begin
result:=TStringList.Create;
FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FP.dwSize:=Sizeof(FP);
Co:=Process32First(FS,FP);
while integer(Co) <> 0 do
begin
result.Add(FP.szExeFile);
Co:=Process32Next(FS,FP);
end;
CloseHandle(FS);
stream:=TMemoryStream.Create;
result.SaveToStream(stream);
AContext.Connection.IOHandler.Write(stream);
stream.Free;
end;
end;
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
05.05.2014, 09:17 8
перед чтением из стрима следует как минимум установить в нуль позицию чтения (св-во Position)
0
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
05.05.2014, 15:08  [ТС] 9
mss, добавил установку позиции в 0, не работает и выдает ошибку.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
Stream: TMemoryStream;
begin
 if idTcpClient1.Connected  then
  begin
   idTcpClient1.Socket.WriteLn(edit2.text);
   memo1.Lines.Add('['+Timetostr(time)+'] '+'Команда "'+ edit2.Text + '" послана серверу!');
    stream.position := 0;
    IdTCPClient1.IOHandler.ReadStream(Stream);
    Memo1.Lines.LoadFromStream(Stream);
  end
else memo1.Lines.Add('['+Timetostr(time)+'] '+'Вы не подключены к серверу!');
end;
http://storage9.static.itmages... 19153f.png
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
05.05.2014, 15:45 10
Объект Stream за тебя Пушкин создавать должен ?)
0
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
05.05.2014, 19:07  [ТС] 11
mss, что-то не получается с этими потоками работать, изменил в клиенте:
Delphi
1
2
3
4
5
stream:=TMemoryStream.Create;
stream.position := 0;
IdTCPClient1.IOHandler.ReadStream(Stream);
Memo1.Lines.LoadFromStream(Stream);
stream.Free;
Теперь вылетает ошибка Out of memory. Помогите пожалуйста.


Добавлено через 1 час 28 минут
mss, думаю, проблема с чтением в клиенте.
Попробовал на сервере вывести сохраненный stringlist в поток в memo на сервере, все вывелось без ошибок.

Измененный код сервера для вывода в memo:
Delphi
1
2
3
4
5
stream:=TMemoryStream.Create;
result.SaveToStream(stream);
stream.position:=0;
Memo1.lines.LoadfromStream(stream);
stream.Free;
Из-за чего происходит ошибка чтения в клиенте? (Out of memory)
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
05.05.2014, 21:36 12
http://stackoverflow.com/quest... g-a-record
0
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
05.05.2014, 22:15  [ТС] 13
mss, что-то я не понял как наоборот от сервера клиенту передать. И этот код одни ошибки выдает.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
05.05.2014, 22:18 14
Цитата Сообщение от NOVICHOK2012 Посмотреть сообщение
я не понял как наоборот от сервера клиенту передать
В корень надо зрить - не рассуждать о том от кого кому передавать, а вникать в параметры вызовов методов Read/WriteStream.
0
6 / 6 / 0
Регистрация: 13.04.2012
Сообщений: 99
05.05.2014, 22:58  [ТС] 15
Цитата Сообщение от mss Посмотреть сообщение
вникать в параметры вызовов методов Read/WriteStream.
Где об этом прочитать? Нашел только примеры для старых версий делфи.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
05.05.2014, 23:09 16
В штатной документации, сопровождающей Indy10
0
05.05.2014, 23:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2014, 23:09
Помогаю со студенческими работами здесь

Получить ip адрес клиента (асинхронный клиент - сервер)
Не могу получить ip адрес клиента (асинхронный клиент - сервер) при получении сообщения на стороне...

Асинхронный клиент-сервер. Рассылка от сервера
Здравствуйте! Пишу клиент - серверное приложения на асинхронных сокетах. Задача состоит в том,...

Клиента Сервера
Всем привет. В общем я с другом создаю проект, в котором друг пишет сайт на php, а я создаю клиент...

Взаимодействие клиента и сервера
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru