Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2011, 17:48   #1
sunnmas
 
Регистрация: 03.08.2009
Сообщений: 6
По умолчанию Прием данных в поток Indy10

Имею Delphi 10Lite

Имеется платка, которая подсоединяется к компу по усб, эмулируя ком порт. Работать с ней умею. есть офис с несколькими компами, объединенных в локалку. Есть приложение, которое может использоваться с данной платкой. Сейчас если кто-то хочет поработать должен брать плату и подсоединять к своему компу. Так она кочует с компа на комп. Нужно сделать так, чтобы она была подключена к какому либо компу. На этом компе запущен сервер, к которому будут подключаться другие через tcp и работать с железом.

сделал на Indy10

Вот рабочий кусок кода (он в сокращении выложен. оставлены только ключевые моменты):

клиент:
TcpCli:=TIdTCPClient.Create(nil);
TcpCli.Port:=3006;
TCPCli.ReadTimeout:=1000;
TCPCli.UseNagle:=false;
...
TCPCli.Host:=NOD;
TcpCli.Connect;
if not TcpCli.Connected then
begin
LOG.WriteString(' TcpCli not connected to server'+#13#10);
exit;
end;
...
try
TCPCli.IOHandler.WriteBufferOpen;
TCPCli.IOHandler.Write(FWrBuf); -шлю 1 байт
TCPCli.IOHandler.WriteBufferClose;
except
on E: EIdException do
begin
LOG.WriteString('WriteBuffer failed. exception: '+E.Message+#13#10);
Result:=false;
end
else
begin
LOG.WriteString('WriteBuffer failed. Fuck, Shit!'+#13#10);
Result:=false;
end;
end;

сервер
procedure TMainForm.IdTCPServerExecute(AConte xt: TIdContext);
var buf: array[0..100] of byte;
begin
try
with AContext.Connection do
begin
try
Dongle.FWrBuf.Clear;
try
IOHandler.ReadStream(Dongle.FWrBuf,1); принимаю 1 байт
except
end;

if Dongle.FWrBuf.Size>0 then
begin
//пишем данные в плату
if not Dongle.WriteBuffer then
exit;

end;

//читаем данные из платы
Dongle.FRdBuf.Clear;
Dongle.ReadBuffer;
if Dongle.FRdBuf.Size>0 then
begin
//отправляем ответ от платы клиентской программе
IOHandler.WriteBufferOpen;
IOHandler.Write(Dongle.FRdBuf);
IOHandler.WriteBufferClose;
exit;
end;

except
end;
end;
finally
end;
end;

Вот так все работает


Но нужно двигаться дальше. Отсылать серваку не 1 байт, а произвольное их количество
Для этого на сервере изменяю так:
...
with AContext.Connection do
begin
try
Dongle.FWrBuf.Clear;
IOHandler.ReadTimeout(50);
try
IOHandler.ReadStream(Dongle.FWrBuf);
except
end;
...

ставлю на сервере usenagle=false

при этом IOHandler.ReadStream не зависает, но и не принимает никаких данных (от клиента все так же шлю пока 1 байт)

Кстати при использовании TIdLOGFile

у клиента:
Sent 12.04.2011 0:24:31: 

у сервера:
Recv 12.04.2011 0:24:31: 


там после двоеточия идет квадратик(типо неотображаемый символ я полагаю)

По сему на сервер данные поступают, но в поток Dongle.FWrBuf этот байт не записывается!

как быть?
sunnmas вне форума Ответить с цитированием
Старый 13.04.2011, 08:36   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Я так принимал:
Код:
procedure TSrvForm.SpyTCPServerExecute(AContext: TIdContext);
begin
 try
  RxStream:=TMemoryStream.Create;
  AContext.Connection.IOHandler.ReadStream(RxStream);//считали поток от клиента
  RxStream.Position:=0;
//и работаем дальше с потоком
А отсылал
Код:
SpyTCPClient.IOHandler.Write(SS,0,true);
где SS это TMemoryStream

Последний раз редактировалось SERG1980; 13.04.2011 в 09:11.
SERG1980 вне форума Ответить с цитированием
Старый 13.04.2011, 17:40   #3
sunnmas
 
Регистрация: 03.08.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Я так принимал:
Код:
procedure TSrvForm.SpyTCPServerExecute(AContext: TIdContext);
begin
 try
  RxStream:=TMemoryStream.Create;
  AContext.Connection.IOHandler.ReadStream(RxStream);//считали поток от клиента
  RxStream.Position:=0;
//и работаем дальше с потоком
А отсылал
Код:
SpyTCPClient.IOHandler.Write(SS,0,true);
где SS это TMemoryStream
не отличается от моего. у тебя сколько данных приходит? какой таймаут?

хотя... есть отличие. щас проверю
sunnmas вне форума Ответить с цитированием
Старый 13.04.2011, 18:03   #4
sunnmas
 
Регистрация: 03.08.2009
Сообщений: 6
По умолчанию

отлично. данные пошли. спасибо!
sunnmas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
php, perl прием данных, чтобы сообщения доходили без перезагрузки страницы Delphinchik Perl 1 16.02.2011 21:07
Прием и передача данных в PCI_E устройство Andrei4 Помощь студентам 2 12.11.2010 18:33
Прием данных по DDE chigik Microsoft Office Excel 3 13.05.2009 10:47
Система мониторинга: Отправка данных+Прием+Обработка+Просмотр Руслан Сагитов Помощь студентам 4 13.10.2008 17:44