Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.02.16;
Скачать: [xml.tar.bz2];

Вниз

сервер на IdTCPServer   Найти похожие ветки 

 
vegarulez   (2013-03-09 00:31) [0]

Привет всем мастерам! Требутеся получить несколько байт на сервере по tcp протоколу. Накачал несколько примеров - разбираюсь - вроде бы всё понятно, но вот вопрос там везде передаётся текстовая информация, а мне надо получить 2 первых байт приходящего потока байт. И отправить тоже не текстовую информацию а тоже несколько байт. подскажите как это сделать? Пробовал разбирая пример отсылать с помощью

AContext.Connection.IOHandler.WriteLn("...") но тут получается только отправка ответа в виде текстовой строки а мен просто нужно отправить сформированный мною пару байт например: 3A 45 65 2F

Подскажите как это сделать? Куда копать? Я так понимаю в сторону передачи файлов по tcp - ведь они тоже побайтово передаются.
Подскажите тогда как правильно организовать ответ сервера - чтобы передать байты. Создать поток записать их туда и передать с помощью Write? Сделав как TByte, или TMemoryStream?
Не поделитесь ссылкой - с примерчиком, или описанием. Заранее спасибо.


 
Германн ©   (2013-03-09 01:56) [1]


> Я так понимаю в сторону передачи файлов по tcp

Неправильно понимаешь. Общение по TCP подразумевает обмен именно двоичной информацией без точного определения её типа.


 
Anatoly Podgoretsky ©   (2013-03-09 08:00) [2]

> Германн  (09.03.2013 01:56:01)  [1]

Кроме того в примере только текстовая информация


 
Dimka Maslov ©   (2013-03-09 10:24) [3]

По протоколу tcp передаются двоичные данные. Для передачи файлов используются протоколы более высокого уровния http, ftp, smtp. Поэтому все средства работы с tcp используют двоичный буфер. В данном случае нам надо принять два байта (указать размер буфера приёма в два байта, когда они придут процедура recv завершит работу), а потом так же послать сколько надо через send и прекратить соединение.


 
vegarulez   (2013-03-29 09:28) [4]

Пытаюсь прочесть первые 2 байта данных. И после этого разорвать соединение. Корректно, отправив обратной стороне в ответ буфер этих 2-ух байт. Но почему то у меня он в итерационном цикле заходит и считывает следующие 2 байта т.е. 3 и 4 получается ставит их в мемо и только потом процедура чтения с клиента завершается.
Что я делаю не так?
procedure TformMain.IdTCPServer1Execute(AContext: TIdContext);
var
cStr : string;
Buff : TBytes;
nContentLength : integer;
begin
try
  section.Enter;
   AContext.Connection.Socket.ReadBytes(Buff,2,false);
   Memo1.Lines.Add("Получено от IP: " + AContext.Connection.Socket.Binding.PeerIP);
   Memo1.Lines.Add(cStr);
   Memo1.Lines.Add(BToH(Buff));
  section.Leave;
finally
 begin
  AContext.Connection.IOHandler.Write(Buff);
  AContext.Connection.IOHandler.CloseGracefully;
 end;
end;
end;


 
vegarulez   (2013-03-29 09:47) [5]

(BToH(Buff)) - Byte в Hex

var
 section : TCriticalSection;


 
Медвежонок Пятачок ©   (2013-03-29 13:30) [6]

Memo1.Lines.Add("Получено от IP: " + AContext.Connection.Socket.Binding.PeerIP + " " + IntToStr(GetCurrentThreadID));


 
vegarulez   (2013-04-14 20:14) [7]

[6] а зачем GetCurrentThreadID??

поменял - вроде работает, но не совсем понимаю почему.

procedure TformMain.IdTCPServer1Execute(AContext: TIdContext);
var
cStr : string;
Buff : TBytes;
nContentLength : integer;
begin
try
  section.Enter;
  AContext.Connection.Socket.ReadBytes(Buff,2,false);
  cStr :=  AContext.Connection.Socket.ReadLn;
  AContext.Connection.IOHandler.WriteLn("200 Ok");
   Memo1.Lines.Add("Получено от IP: " + AContext.Connection.Socket.Binding.PeerIP + " " + IntToStr(GetCurrentThreadID));
   Memo1.Lines.Add(cStr);
   Memo1.Lines.Add(BToH(Buff));
 section.Leave;
finally
begin
AContext.Connection.IOHandler.Write(Buff);
AContext.Connection.IOHandler.CloseGracefully;
end;
end;
end;


я так полагаю из за того, что  

1. полностью прочёл то что шлёт клиент в строке
  cStr :=  AContext.Connection.Socket.ReadLn;


2. ответил клиенту - тем самым как бы цикл отправки серверу завершён - т.к. получен ответ от сервера требуемый по стандарту tcp\ip в отличие от udp.

Правильны ли мои умозаключения?

Тогда ещё один вопрос в блоке finally
AContext.Connection.IOHandler.Write(Buff);
получается не будет выполнен? ибо ответ клиенту уже произошёл?
Как тогда правильно сделать...


 
Медвежонок Пятачок ©   (2013-04-14 21:02) [8]

[6] а зачем GetCurrentThreadID??

Но почему то у меня он в итерационном цикле заходит и считывает следующие 2 байта т.е. 3 и 4 получается ставит их в мемо и только потом процедура чтения с клиента завершается.

Что ты видишь в логе при приеме первых двух байтов и что ты видишь при приеме следующих двух байтов?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2014.02.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
2-1366383198
Теркин
2013-04-19 18:53
2014.02.16
Как получить список форм проекта?


15-1377682520
Наталья
2013-08-28 13:35
2014.02.16
Подскажите новичку.


15-1377698945
aka
2013-08-28 18:09
2014.02.16
вопрос знатокам JavaSccript


2-1365088308
Афонтий
2013-04-04 19:11
2014.02.16
Copy String to Char Array


2-1365333369
quart
2013-04-07 15:16
2014.02.16
gdi+ error





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский