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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2017, 21:14   #1
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка IdTcpServer Delphi XE8 прием передача данных

Здравствуйте!
пишу сервер с компонентом IdTcpServer на Delphi XE8
клиент сначала подкачивает ресы по адресу ip-adress1:8080 (из TomCat)
а потом делает запрос на мой сервер по адресу ip-adress1:8081
мне от клиента приходит такое сообшение
Код:
<policy-file-request/>.
на что я должен ответить
Код:
<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>.
делаю так
Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  Text: string;
begin
  Text := AContext.Connection.Socket.ReadLn();
  AContext.Connection.Socket.WriteLn('<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>');
end;
проверяю WireSharkом ничего не приходило, да и клиент не отправил следующее сообщение
не могу понять почему. искал в google но там так же делается и примеры для Д6 и Д7 в основном
подскажите что я не так сделал или не так понял,
в принципе нужно работать со Stream, но не получалось я решил хоть так для начала
Спасибо!
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 21.01.2017, 21:37   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

у меня indy 10
и у меня нет AThread: TIdPeerThread
Код:
procedure TForm1.TCPServer1Execute(AThread: TIdPeerThread); 
begin 
AThread.Connection.Writeln('Это сообщение сервера');
end;
или
Код:
procedure TForm1.TCPServer1Execute(AThread: TIdPeerThread);
var 
MemStream:TMemoryStream;
FileName:string ;
SizeFile:integer;
begin
MemStream:=TMemoryStream.Create; // создаём поток памяти
MemStream.LoadFromFile('c:\example.txt'); // загружаем в поток памяти файл
SizeFile:=MemStream.Size; // определяем размер файла
AThread.Connection.Writeln(FileName); // отсылаем название файла
AThread.Connection.Writeln(SizeFile); // отсылаем размер файла AThread.Connection.OpenWriteBuffer; // открываем буфер записи
AThread.Connection.WriteStream(MemStream); // посылаем файл AThread.Connection.CloseWriteBuffer; // закрываем буфер записи 
MemStream.Free; // уничтожаем поток памяти 
end;
так тоже не посылает
Код:
AContext.Binding.Send('<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>');
Код:
AContext.Binding.SendTo('213.27.32.135', AContext.Binding.Port, '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>', Id_IPv4, nil);
ip статический, порты открыты
VirusN13

Последний раз редактировалось ArtGrek; 21.01.2017 в 22:51.
ArtGrek вне форума Ответить с цитированием
Старый 22.01.2017, 09:07   #3
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот так прошло сообщение
Код:
AContext.Binding.SendTo(AContext.Binding.PeerIP, AContext.Binding.PeerPort,'<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>',Id_IPv4, nil);
но от советов не откажусь, раньше с этим не сталкивался
только не посылайте почитать, уже масштаб 200% в хроме, устал читать)
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 23.01.2017, 04:10   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

хммм...
так на всякий случай, может кто нибудь все таки подскажет
Код:
...
var
  cport: word;
  cip: string;
  pr: TIdIPVersion;

implementation

...

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  cip := AContext.Binding.PeerIP;
  cport := AContext.Binding.PeerPort;
  pr := AContext.Binding.IPVersion;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  buff: TIdBytes;
  s: string;
begin
  AContext.Binding.RecvFrom(buff, cip, cport, pr);
  s := BytesToString(buff, nil);
  if s='<policy-file-request/>.' then
    AContext.Binding.SendTo(AContext.Binding.PeerIP, AContext.Binding.PeerPort,'<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>',Id_IPv4, nil);

end;
при приёме появляется ошибка, про нее никак не пойму
Socket Error # 10038 Socket operation on non-socket.

при отправке появляется ошибка
Socket Error # 10053 Software caused connection abort.

ЗЫ. искал читал ищу читаю и буду искать и читать справки
прошу только по делу
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 23.01.2017, 09:26   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

А где код клиента IdTCPClient1?
Может в нем проблема например отваливается сразу после отправки сообщения или же у вас клиент сторонний?
Да и по тестируйте внутри своей сети.

Вот работает
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.DefaultPort:= 8080;
IdTCPServer1.Active:= true;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  strText: String;
begin
  strText:= AThread.Connection.ReadLn();
if strText = '<policy-file-request/>.' then
   strText:= '<?xml version="1.0"?><cross-domain-policy>' +
  '<allow-access-from domain="*" to-ports="*" /></cross-domain-policy>';
 AThread.Connection.Socket.Send(strText[1], Length(strText));
end;

Последний раз редактировалось Aliens_wolfs; 23.01.2017 в 10:29.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2017, 10:17   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

да клиент сторонний,
у меня получалось и принять от клиента и отправить
но цельный диалог не выходит пока что
Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  strText: String;
begin
а вот как у меня на Delphi XE
Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 23.01.2017, 10:29   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

strText: AnsiString;

Клиент

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Host := '127.0.0.1';
  IdTCPClient1.Port:= 8080;
  IdTCPClient1.Connect;
  IdTCPClient1.SendCmd('<policy-file-request/>.');

  Memo1.Lines.Text:= IdTCPClient1.ReadLn();
  IdTCPClient1.Disconnect;
end;

Сейчас на Xe все проверю и отпишусь

Последний раз редактировалось Aliens_wolfs; 23.01.2017 в 10:44.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2017, 10:43   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот мой код
он принимает но не посылает
и почему то у меня не выполняется условие хотя там 100% одно другому равно я из мемо копирывал и вставлял
Код:
var
  Form1: TForm1;
  StrStream: TStringStream;
...
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  StrStream.Free;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  StrStream := TStringStream.Create;
...
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  buff: TIdBytes;
  s, s1: String;
begin
  Memo2.Lines.Add('TCP  Execute');

  AContext.Connection.IOHandler.ReadStream(StrStream, -1, True);
  s := StrStream.DataString;
  Memo2.Lines.Add(s);

  if s = '<policy-file-request/>' then
  begin
    Memo2.Lines.Add('yslovie_vipolnilos');
    s1 := '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>';
    buff := RawToBytes(s1, SizeOf(s1));
    AContext.Connection.IOHandler.Write(buff, SizeOf(buff), 1);
  end;
end;
VirusN13

Последний раз редактировалось ArtGrek; 23.01.2017 в 10:53.
ArtGrek вне форума Ответить с цитированием
Старый 23.01.2017, 10:52   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

buff := RawToBytes(s1[1], SizeOf(s1)); нужно так сделать иначе он 0 в начале ставит и принимающий на 0 не показывает данные

еще в объявленных можно сделать так s, s1: AnsiString;


еще можно так сделать

AContext.Connection.IOHandler.Write (Pointer(S1)^, SizeOf(s1), 1);



Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  s, s1: AnsiString;
begin
  Memo2.Lines.Add('TCP  Execute');

  AContext.Connection.IOHandler.ReadStream(StrStream, -1, True);
 S:= StrStream.DataString;
  Memo2.Lines.Add(s);
  
  if Pos('<policy-file-request/>', s) <> 0 then
  begin
    Memo2.Lines.Add('yslovie_vipolnilos');
    s1 := '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>';
    AContext.Connection.IOHandler.Write(S1[1], SizeOf(s1), 1);
  end;
end;
Цитата:
и почему то у меня не выполняется условие хотя там 100% одно другому равно я из мемо копирывал и вставлял
StrStream.DataString в конце всегда перевод строки возвращает поэтому и не ловит

Последний раз редактировалось Aliens_wolfs; 23.01.2017 в 11:16.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.01.2017, 11:02   #10
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот лог, Exception в конце это нормально?
но сообщение не прошло
Код:
TCP  BeforeBind
TCP  AfterBind
TCP  BeforeListenerRun
TCP  ContextCreated
TCP  Connect
TCP  Execute
<policy-file-request/>
yslovie_vipolnilos
TCP  Disconnect
TCP  Exception
Connection Closed Gracefully.
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прием и передача данных по COM порту PTyTb32 Компоненты Delphi 2 26.06.2015 22:12
Прием и передача данных в PCI_E устройство Andrei4 Помощь студентам 2 12.11.2010 18:33
Передача потока с использованием idtcpServer Lvenok Помощь студентам 0 24.03.2010 19:03
передача файла от idtcpclient к idtcpserver SeЯgey Работа с сетью в Delphi 1 13.05.2008 11:21