Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.08.2012, 15:21
MaxN MaxN вне форума
Прохожий
 
Регистрация: 15.05.2011
Сообщения: 9
Репутация: 10
По умолчанию ServerSocket передать браузеру html документ с JavaScript

Добрый день.
Я через компонент ServerSocket (порт = 80) хочу передать браузеру html документ с JavaScript.
Если передаю чистый html, то проблем нет.
Например:
<html>
<BODY>
Hello!
</BODY>
</html>

Как только добавляю в документ простой JavaScript, то он не выполняется.
Например:
<html>
<BODY>
Hello!
<script type="text/javascript">
for (i = 0; i <= 9; i++){
document.write('Шаг № ' + i)
document.write('<br>')
}
</BODY>
</html>

Я так понимаю что перед передачей документа, должен быть ответ сервера HTTP/1.1 200 OK и т.д.
Прочитал и перепробовал куча информации, интересной, но к сожалению ответа так и не нашел.
Прошу Вашей помощи!
Ответить с цитированием
  #2  
Старый 29.08.2012, 15:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

тэг script не закрыт:
Код HTML:
} </script> </BODY>
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 29.08.2012, 16:47
MaxN MaxN вне форума
Прохожий
 
Регистрация: 15.05.2011
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
тэг script не закрыт:
Код HTML:
} </script> </BODY>

Это я здесь опечатался, в коде верно написано, и при перетаскивании локального файла с этим кодом в любой браузер все нормально работает, т.е. скрипт выполняется.
Ответить с цитированием
  #4  
Старый 29.08.2012, 18:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

причин может быть много, например с длиной опечатался или в 13 строчке ошибка
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 29.08.2012, 18:56
MaxN MaxN вне форума
Прохожий
 
Регистрация: 15.05.2011
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
причин может быть много, например с длиной опечатался или в 13 строчке ошибка
Хорошо, а какой должен быть минимальный ответ сервера ( от HTTP/1.1 200 OK до передачи <html>)? Потому что другие причины вряд ли могут быть…
Какая 13-я строчка?
Ответить с цитированием
  #6  
Старый 29.08.2012, 18:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

хотя бы Content-Type и Content-Length, если не чанками передашь
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 29.08.2012, 19:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

и про разделитель \r\n не забыть
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 29.08.2012, 19:30
MaxN MaxN вне форума
Прохожий
 
Регистрация: 15.05.2011
Сообщения: 9
Репутация: 10
По умолчанию

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin

for i:=0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
ServerSocket1.Socket.Connections[i].SendText('HTTP/1.1 200 OK'+#$0D+#$0A);
ServerSocket1.Socket.Connections[i].SendText('Server: MyServer'+#$0A);
ServerSocket1.Socket.Connections[i].SendText('Content-type: text/html'+#$0A);
//ServerSocket1.Socket.Connections[i].SendText('Accept-Ranges: bytes'#$0A);
s := IntToStr(Length(Memo1.Lines.Text));
ServerSocket1.Socket.Connections[i].SendText('Content-Length: '+ s +#$0A);
ServerSocket1.Socket.Connections[i].SendText('Connection: close'+#$0A+#$0A);
//ServerSocket1.Socket.Connections[i].SendText('Connection: keep-alive'+#$0A+#$0A);

for j:=0 to Memo1.Lines.Count-1 do
ServerSocket1.Socket.Connections[i].SendText(Memo1.Lines[j]);
ServerSocket1.Socket.Connections[i].Close;

end;
Админ: Пользуемся тегами для оформления кода!

Т.е. при любом запросе выдаем клиенту это. В Memo1 тот HTML-код который я писал выше. В итоге выводит только "Hello" без выполнения JS.

Последний раз редактировалось Admin, 29.08.2012 в 21:25.
Ответить с цитированием
  #9  
Старый 29.08.2012, 20:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

все работает:

Unit1.pas

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    ServerSocket1: TServerSocket;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo2.Lines.Add(Socket.ReceiveText);
  Socket.SendText('HTTP/1.1 200 OK'#13#10);
  Socket.SendText('Content-Type: text/html'#13#10);
  Socket.SendText('Content-Length: '+IntToStr(Length(Memo1.Text))+#13#10);
  Socket.SendText(#13#10);
  Socket.SendText(Memo1.Text);
end;

end.

Unit1.dfm

Код:
object Form1: TForm1
  Left = 192
  Top = 124
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsStayOnTop
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 80
    Top = 64
    Width = 489
    Height = 225
    Lines.Strings = (
      '<html>'
      '  <body>'
      '    Hello!<br>'
      '    <script type="text/javascript">'
      '      for(i = 0; i < 10; i++){'
      '      document.write(''i = '' + i)'
      '      document.write(''<br>'')'
      '      }'
      '    </script>'
      '  </body>'
      '</html>')
    TabOrder = 0
    WordWrap = False
  end
  object Memo2: TMemo
    Left = 80
    Top = 320
    Width = 489
    Height = 233
    TabOrder = 1
  end
  object ServerSocket1: TServerSocket
    Active = True
    Port = 8081
    ServerType = stNonBlocking
    OnClientRead = ServerSocket1ClientRead
    Left = 664
    Top = 208
  end
end

http://localhost:8081/
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
MaxN (29.08.2012)
  #10  
Старый 29.08.2012, 21:12
MaxN MaxN вне форума
Прохожий
 
Регистрация: 15.05.2011
Сообщения: 9
Репутация: 10
По умолчанию

Спасибо NumLock!!!
Всё действительно заработало. Начал искать в чем же дело и выяснил что JS не выполняется когда в порт html документ из Memo1 передается построчно в цикле. Почему так происходит так и не выяснил, но главное что заработало!
Спасибо еще раз!!!!
Ответить с цитированием
  #11  
Старый 30.08.2012, 08:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от MaxN
JS не выполняется когда в порт html документ из Memo1 передается построчно в цикле
нет, не в этом проблема у тебя, смотри внимательней!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 01.09.2012, 14:23
MaxN MaxN вне форума
Прохожий
 
Регистрация: 15.05.2011
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
нет, не в этом проблема у тебя, смотри внимательней!
Я в работающем коде заменил
ServerSocket1.Socket.Connections[i].SendText(Memo1.Text);
на
for j:=0 to Memo1.Lines.Count-1 do
ServerSocket1.Socket.Connections[i].SendText(Memo1.Lines[j]);
и перестало работать, поэтому и сделал такой вывод…
\r\n – исправил.
Может быть скажите в чем дело?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter