Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Mожет cервер быть инициатором обмена данных?
 
 автор: K   (06.06.2009 в 12:39)   письмо автору
 
 

В JavaScript при помощи XMLHttpRequest можно от Клиента послать сообщение на Сервер и получить ответ. Инициатива обмена данными на стороне Клиента, а Сервер пассивно отвечает. А как быть, если Серверу нужно срочно уведомить Клиента о событии (аварийная ситуация, от оператора требуются срочные действия)? Может ли Сервер выступить в роли инициатора обмена данными? Может ли JavaScript обработать инициативу от Сервера?

  Ответить  
 
 автор: sim5   (06.06.2009 в 13:01)   письмо автору
 
   для: K   (06.06.2009 в 12:39)
 

И как вы себе представляете механизм "инициативы" сервера?

  Ответить  
 
 автор: PAT   (06.06.2009 в 13:05)   письмо автору
 
   для: K   (06.06.2009 в 12:39)
 

Нет, "инициативных" серверов не бывает. И быть не может.

Ибо интернет построен на одностороннем принципе отдачи сервером ответа на запрос браузера.

Тут как следователь на допросе - "Вопросы здесь задаю только я!": браузер - это как раз следователь,
а сервер - это допрашиваемый.

  Ответить  
 
 автор: K   (06.06.2009 в 14:51)   письмо автору
 
   для: PAT   (06.06.2009 в 13:05)
 

Если не брать UDP или RMI (UDP используем для связи с модемами, собирающими информацию, а Applet – RMI_client – RMI_server сейчас не используем, так как появился HttpServer в java JDK6, более простой механизм для создания сервера без лишних заморочек), а ограничиться TCP/IP, то и там наверняка можно как-нибудь послать сообщение от сервера к клиенту (адрес то у клиента есть). Вопрос не в том, как послать клиенту что-нибудь, вопрос – как это получить в JavaScript.

Подчеркиваю, что не являюсь специалистом по интернету, но так как нужна удаленная связь, использую по маленьку

  Ответить  
 
 автор: sim5   (06.06.2009 в 15:00)   письмо автору
 
   для: K   (06.06.2009 в 14:51)
 

В момет времени N я нахожусь в контакте с серверм К, а уже в момент времени М "общаюсь" с сервером S (или вообще отключен), при этом сервер К даже и не подозревает об этом, и в это время ему ни стого ни с чего приспичило сообщить мне нечто сугубо потрясающее. И даже зная мой адрес, как вы заставите мой браузер отобразить это нечто потрясающее?

  Ответить  
 
 автор: K   (06.06.2009 в 15:14)   письмо автору
 
   для: sim5   (06.06.2009 в 15:00)
 

Оператор всегда на связи с сервером (все его действия фиксируются сервером), и он время от времени при помощи XMLHttpRequest запрашивает последнюю информацию о текущих событиях. Но вот как срочно сообщить оператору «нечто потрясающее», это не понятно. Получается, что нужно постоянно в цикле крутить запрос от XMLHttpRequest (в асинхронном режиме), чтобы не прозевать срочного сообщения, а это ну совсем не красиво, хотя и реализуемо.

  Ответить  
 
 автор: sim5   (06.06.2009 в 15:18)   письмо автору
 
   для: K   (06.06.2009 в 15:14)
 

Если постоянно на связи, и если Ajax, то организуйте постоянные запросы на сервер, и если в определенный квант времени что-то там случилось, сообщайте клиенту. Иначе никак, инициатором обмена с сервером всегда является клиент, а не наоборот. Наоброт, это только резиндентное ПО у клиента, но это уже нечто другое.

  Ответить  
 
 автор: K   (06.06.2009 в 15:27)   письмо автору
 
   для: sim5   (06.06.2009 в 15:18)
 

Мы привыкли работать по инициативе (требование безопасности для быстротекущих технологических процессов) и переходить на опросный метод (клиент все время опрашивает сервер) не только «не красиво» и создает лишнюю алгоритмическую волокиту, но и просто не приветствуется заказчиками, уже приученных к таким понятиям как приоритетный процесс и процесс реального времени (это когда приоритетный процесс все остальные процессы отодвигает в сторону и начинает выполнять срочное задание).

Может все-таки как-то можно получить в JavaScript то, что ему послал сервер?

  Ответить  
 
 автор: sim5   (06.06.2009 в 15:33)   письмо автору
 
   для: K   (06.06.2009 в 15:27)
 

>Может все-таки как-то можно получить в JavaScript то, что ему послал сервер?

Как? Как вы что-то подключите у клиента по "инициативе" сервера, о которой клиент ни рылом, ни духом...?

  Ответить  
 
 автор: K   (06.06.2009 в 15:35)   письмо автору
 
   для: sim5   (06.06.2009 в 15:33)
 

Может, по каким американским сайтам походить, они все это разрабатывали, должны в точности знать все возможности?

  Ответить  
 
 автор: Valick   (06.06.2009 в 15:37)   письмо автору
 
   для: K   (06.06.2009 в 15:27)
 

Может я не понимаю что вы хотите, но поставьте заказчику сервер и пусть они общаются с другим сервером когда им вздумается, выступая то в роли клиента, то сервера.

  Ответить  
 
 автор: K   (06.06.2009 в 15:43)   письмо автору
 
   для: Valick   (06.06.2009 в 15:37)
 

Два сервера (две задачи) могут взаимодействовать по инициативе, это не проблема. Проблема с оператором, который взаимодействует не с одним из серверов, а с браузером. Как ему что-то сообщить в порядке инициативы, а не в порядке его постоянного опроса одного из серверов.

  Ответить  
 
 автор: sim5   (06.06.2009 в 15:55)   письмо автору
 
   для: K   (06.06.2009 в 15:43)
 

Я уже даже и не знаю, что вам ответь.... НИЗЗЯ! Так как это вы себе представляете - НИЗЗЯ!

  Ответить  
 
 автор: K   (06.06.2009 в 16:22)   письмо автору
 
   для: sim5   (06.06.2009 в 15:55)
 

Хорошо, не специалист в Интернете, но вот вам логическая цепочка рассуждений – когда пользователь через браузер выходит в Интернет, ему присваивается IP. Зачем? Так как TCP/IP асинхронный протокол (синхронный или опросный протокол тут же сожрал бы кучу ресурсов Интернета), то не только браузер что-то посылает, но и ему обязаны что-то присылать, это единственный способ существования асинхронного протокола, адрес должен быть у обоих, и у сервера, и у клиента. Т.е. браузеру все-таки что-то посылается? И он на что-то реагирует? Следовательно, на браузер можно воздействовать со стороны сервера?

  Ответить  
 
 автор: sim5   (06.06.2009 в 16:46)   письмо автору
 
   для: K   (06.06.2009 в 16:22)
 

На браузер вы никак не сможете воздействовать - браузер делает запрос и получает ответ с сервера. Асинхронный это означает не воздействие, а способ передачи данных, грубо говоря, это означает, что передача данных происходит независимо от основного процесса, не синхронно с ним.
Как только сервер отдаст все, что запросил браузер, он тут же забывает о клиенте. Но, если ему захочеться по собственной инициативе что-то дополнительно передать браузеру, сверх того о чем его просили, браузер уже реагировать не будет. Реагировать на "инциативу" сервера в этом случе сможет, например, Касперский, сообщив об атаке на компьютер клиента.
Вы видимо знаете, что Windows XP может обеспечить удаленное управление компьютером, например, получить доступ к рабочему столу. Но это работает соответсвующая служба ОС (резедентное ПО), вот в таком ключе, имея свое ПО установленное у клиента, вы еще сможете достучаться до него по "инициативе" сервера. К примеру, так по сети управляются камеры видеонаблюдения.

  Ответить  
 
 автор: K   (06.06.2009 в 17:12)   письмо автору
 
   для: sim5   (06.06.2009 в 16:46)
 

«Дополнительное ПО» это невыход. У нас был вариант – Java на сервере, Java у клиента. Но мы с радостью выбросили это, и перешли для визуализации у клиента на браузер, так как это проще – выкинули пол пакета, на основе чего раньше делали визуализацию.

  Ответить  
 
 автор: PAT   (06.06.2009 в 16:10)   письмо автору
 
   для: K   (06.06.2009 в 15:43)
 

Вот я, например, работаю с провайдером через его прокси.
Т.е. у меня - динамический IP.

Что означает, что загружаю я какой-то документ с вашего сервера, имея, например, IP 123.45.67.890, а после окончания загрузки этого документа провайдер мгновенно "перекинет" меня на IP 123.45.67.067. А предыдущее значение IP "перейдёт" какому-то другому клиенту этого же провайдера.

Кому будет посылать свою "инициативу" ваш сервер, запомнивший адрес моего запроса?
На деревню дедушке? :-)

  Ответить  
 
 автор: K   (06.06.2009 в 16:38)   письмо автору
 
   для: PAT   (06.06.2009 в 16:10)
 

А мне казалось, что временный IP назначается когда входишь в Интернет и не меняется, пока не отключишься. Уточните, пожалуйста. Новый IP назначается для каждой новой сессии? А не назначается провайдером на все время работы в Интернете, пока не отключились от Интернета?

  Ответить  
 
 автор: PAT   (06.06.2009 в 21:14)   письмо автору
 
   для: K   (06.06.2009 в 16:38)
 

>"Новый IP назначается для каждой новой сессии?"

Нет. Сессии, ИМХО, тут вовсе не причём.
Я не специалист по TSP/IP-технологиям, потому могу говорить только о своих визуальных наблюдениях.

Например, если я зайду на страницу http://2ip.ru/, меня там определят как 123.45.67.890
При каждом обновлении этой страницы (хоть при ежесекундном) я буду видеть свой новый IP. И он
практически всякий раз будет иным. Разумеется - в пределах диапазона адресов моего провайдера.

Вот данные за последние пять нажатий на кнопку "Обновить" браузера (последняя группа IP-адреса):
ххх.ххх.хх.202
ххх.ххх.хх.204
ххх.ххх.хх.219
ххх.ххх.хх.251
ххх.ххх.хх.209

  Ответить  
 
 автор: K   (06.06.2009 в 22:44)   письмо автору
 
   для: PAT   (06.06.2009 в 21:14)
 

Странно, зашел на http://2ip.ru/ несколько раз, и все время один и тот же адрес

Может, потому что у меня ADSL-модем?

  Ответить  
 
 автор: PAT   (06.06.2009 в 23:16)   письмо автору
 
   для: K   (06.06.2009 в 22:44)
 

Дело не в модеме, дело в провайдере, о чём я вам уже писал ранее, а вы не поняли.
У меня тоже ADSL-модем.

  Ответить  
 
 автор: K   (07.06.2009 в 01:11)   письмо автору
 
   для: PAT   (06.06.2009 в 23:16)
 

Кстати, провел эксперимент. Запустил локальный сервер (т.е. все происходило на одном и том же компьютере), в нем считал при первом обращении локального клиента его адрес (127.0.0.1:80) , запустил независимый процесс, который, выждав 1 минуту, послал клиенту сообщение. На Java выглядело так
Socket s=new Socket(ip.getHostName(),ip.getPort());
String msg="<script>alert('!!!!!')</script>";
s.getOutputStream().write(msg.getBytes());
Ошибок не было выдано, иначе обязательно возникло бы исключение
Браузер FireFox молчит как партизан
Попытался после этого куска вставить считывание ответа от клиента (браузера)
byte buf[] = new byte[64*1024];
int n= s.getInputStream().read(buf);
Ничего не считывается, после небольшого таймаута возвращается -1

Как достучаться до браузера (чтобы он хоть как-то прореагировал) ума не приложу.

  Ответить  
 
 автор: Valick   (07.06.2009 в 01:18)   письмо автору
 
   для: K   (07.06.2009 в 01:11)
 

достукивайтесь браузером до локального сервера с нужной Вам частотой
а локальным сервером "ловите" откуда угодно то что нужно

  Ответить  
 
 автор: Valick   (07.06.2009 в 01:36)   письмо автору
 
   для: K   (07.06.2009 в 01:11)
 

А вот ещё идея...
по образу и подобию автозапуска дисков (например CHIP-DVD) когда вставляете диск в привод запускается браузер с нужной страницей.
локальным вебсервером Вы принимаете данные формируете страницу и скармливаете её системе (правда придётся разрешить это делать серверу)
можно даже с этой страницы общаться с сервером инициатором напрямую, по средствам Аякса в течении допустим нескольких минут для приёма ещё каких нибудь данных

  Ответить  
 
 автор: sim5   (07.06.2009 в 07:56)   письмо автору
 
   для: K   (07.06.2009 в 01:11)
 

Вот вы сами же пишите человеческое, а значит понимаете суть процесса, и в то же время несете невообразимое. Сервер не браузеру посылает пакеты свои, эти пакеты в фоновом режиме принимаются модемом и аккуратно помещаются в буфер, и любое заинтересованное приложение может их получить. Но для этого оно само должно следить за буфером, реагировать на его заполение и считывать. Сам же буфер не заставит браузер обратиться к нему.

  Ответить  
 
 автор: Valick   (06.06.2009 в 16:14)   письмо автору
 
   для: K   (06.06.2009 в 15:43)
 

Вам не браузер нужен, а клиент типа аськи

  Ответить  
 
 автор: K   (06.06.2009 в 16:33)   письмо автору
 
   для: Valick   (06.06.2009 в 16:14)
 

За идею воспользоваться протоколом OSCAR, большое спасибо. Обязательно проработаем как вариант.

  Ответить  
 
 автор: K   (07.06.2009 в 12:43)   письмо автору
 
   для: K   (06.06.2009 в 12:39)
 

test

  Ответить  
 
 автор: K   (07.06.2009 в 12:49)   письмо автору
 
   для: K   (06.06.2009 в 12:39)
 

Итого

На сервере в функции обработки запросов клиентов вызывались функции

public static InetSocketAddress ip;
public static boolean firstClient=true;

public static void testClient(HttpExchange exchange){

if(firstClient){
firstClient=false;
ip=exchange.getRemoteAddress();
System.out.println("testClient ip="+ip);
new Thread(){
public void run(){
try{
sleep(30*1000); // 30 sec
URL url=new URL("http:/"+ip.toString());
URLConnection urlConnect=url.openConnection();
urlConnect.setDoOutput(true);
OutputStream out=urlConnect.getOutputStream();
// --> java.net.ConnectException: Connection refused: connect
out.write("Hellow".getBytes());
urlConnect.setDoInput(true);
InputStream in=urlConnect.getInputStream();
byte buf[] = new byte[64*1024];
int len=0,n;
while((n=in.read(buf,len,buf.length-len))!=-1)
len+=n;
String text = new String(buf, 0, len);
}catch(Exception e){ System.out.println("testClient Exception="+e); }
}
}.start();
}
}
//-----------------------------------------------------------------------------------------
или
//-----------------------------------------------------------------------------------------
public static void testClient(HttpExchange exchange){

if(firstClient){
firstClient=false;
ip=exchange.getRemoteAddress();
System.out.println("testClient ip="+ip);
new Thread(){
public void run(){
try{
sleep(30*1000); // 30 sec
Socket s=new Socket(ip.getHostName(),ip.getPort());
// --> java.net.ConnectException: Connection refused: connect
OutputStream out=s.getOutputStream();
out.write("Hellow".getBytes());
InputStream in=s.getInputStream();
byte buf[] = new byte[64*1024];
int len=0,n;
while((n=in.read(buf,len,buf.length-len))!=-1)
len+=n;
String text = new String(buf, 0, len);
}catch(Exception e){ System.out.println("testClient Exception="+e); }
}
}.start();
}
}
//-----------------------------------------------------------------------------------------

В обоих случаях было отказано в соединении

java.net.ConnectException: Connection refused: connect

  Ответить  
 
 автор: aexb   (08.06.2009 в 12:24)   письмо автору
 
   для: K   (06.06.2009 в 12:39)
 

*Воровато оглядываясь по сторонам*
Посмотрите в сторону .net, там можно писать службы, которые как раз выступают инициаторами. И если вам нужен проект с широкой и сложной бизнес-логикой, то .net - самое оно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования