![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сервер на IdTCPServer [D7, XP]
vegarulez © (2013-03-09 00:31:00)Привет всем мастерам! Требутеся получить несколько байт на сервере по tcp протоколу. Накачал несколько примеров - разбираюсь - вроде бы всё понятно, но вот вопрос там везде передаётся текстовая информация, а мне надо получить 2 первых байт приходящего потока байт. И отправить тоже не текстовую информацию а тоже несколько байт. подскажите как это сделать? Пробовал разбирая пример отсылать с помощью
AContext.Connection.IOHandler.WriteLn('...')но тут получается только отправка ответа в виде текстовой строки а мен просто нужно отправить сформированный мною пару байт например: 3A 45 65 2F
Подскажите как это сделать? Куда копать? Я так понимаю в сторону передачи файлов по tcp - ведь они тоже побайтово передаются.
Подскажите тогда как правильно организовать ответ сервера - чтобы передать байты. Создать поток записать их туда и передать с помощью Write? Сделав как TByte, или TMemoryStream?
Не поделитесь ссылкой - с примерчиком, или описанием. Заранее спасибо.
Медвежонок Пятачок (2013-04-14 21:02:00) [1][6] а зачем GetCurrentThreadID??
Но почему то у меня он в итерационном цикле заходит и считывает следующие 2 байта т.е. 3 и 4 получается ставит их в мемо и только потом процедура чтения с клиента завершается.
Что ты видишь в логе при приеме первых двух байтов и что ты видишь при приеме следующих двух байтов?
vegarulez (2013-04-14 20:14:00) [2][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-03-29 13:30:00) [3]Memo1.Lines.Add('Получено от IP: ' + AContext.Connection.Socket.Binding.PeerIP + ' ' + IntToStr(GetCurrentThreadID));
vegarulez (2013-03-29 09:47:00) [4](BToH(Buff)) - Byte в Hex
var
section : TCriticalSection;
vegarulez (2013-03-29 09:28:00) [5]Пытаюсь прочесть первые 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;
Dimka Maslov (2013-03-09 10:24:00) [6]По протоколу tcp передаются двоичные данные. Для передачи файлов используются протоколы более высокого уровния http, ftp, smtp. Поэтому все средства работы с tcp используют двоичный буфер. В данном случае нам надо принять два байта (указать размер буфера приёма в два байта, когда они придут процедура recv завершит работу), а потом так же послать сколько надо через send и прекратить соединение.
Anatoly Podgoretsky (2013-03-09 08:00:00) [7]> Германн (09.03.2013 01:56:01) [1]
Кроме того в примере только текстовая информация
Германн (2013-03-09 01:56:00) [8]
> Я так понимаю в сторону передачи файлов по tcp
Неправильно понимаешь. Общение по TCP подразумевает обмен именно двоичной информацией без точного определения её типа.