Форум: "Начинающим";
Текущий архив: 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.
Правильны ли мои умозаключения?
Тогда ещё один вопрос в блоке finallyAContext.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