|
|
|
| В JavaScript при помощи XMLHttpRequest можно от Клиента послать сообщение на Сервер и получить ответ. Инициатива обмена данными на стороне Клиента, а Сервер пассивно отвечает. А как быть, если Серверу нужно срочно уведомить Клиента о событии (аварийная ситуация, от оператора требуются срочные действия)? Может ли Сервер выступить в роли инициатора обмена данными? Может ли JavaScript обработать инициативу от Сервера? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 12:39)
| | И как вы себе представляете механизм "инициативы" сервера? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 12:39)
| | Нет, "инициативных" серверов не бывает. И быть не может.
Ибо интернет построен на одностороннем принципе отдачи сервером ответа на запрос браузера.
Тут как следователь на допросе - "Вопросы здесь задаю только я!": браузер - это как раз следователь,
а сервер - это допрашиваемый. | |
|
|
|
|
|
|
|
для: PAT
(06.06.2009 в 13:05)
| | Если не брать UDP или RMI (UDP используем для связи с модемами, собирающими информацию, а Applet – RMI_client – RMI_server сейчас не используем, так как появился HttpServer в java JDK6, более простой механизм для создания сервера без лишних заморочек), а ограничиться TCP/IP, то и там наверняка можно как-нибудь послать сообщение от сервера к клиенту (адрес то у клиента есть). Вопрос не в том, как послать клиенту что-нибудь, вопрос – как это получить в JavaScript.
Подчеркиваю, что не являюсь специалистом по интернету, но так как нужна удаленная связь, использую по маленьку | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 14:51)
| | В момет времени N я нахожусь в контакте с серверм К, а уже в момент времени М "общаюсь" с сервером S (или вообще отключен), при этом сервер К даже и не подозревает об этом, и в это время ему ни стого ни с чего приспичило сообщить мне нечто сугубо потрясающее. И даже зная мой адрес, как вы заставите мой браузер отобразить это нечто потрясающее? | |
|
|
|
|
|
|
|
для: sim5
(06.06.2009 в 15:00)
| | Оператор всегда на связи с сервером (все его действия фиксируются сервером), и он время от времени при помощи XMLHttpRequest запрашивает последнюю информацию о текущих событиях. Но вот как срочно сообщить оператору «нечто потрясающее», это не понятно. Получается, что нужно постоянно в цикле крутить запрос от XMLHttpRequest (в асинхронном режиме), чтобы не прозевать срочного сообщения, а это ну совсем не красиво, хотя и реализуемо. | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 15:14)
| | Если постоянно на связи, и если Ajax, то организуйте постоянные запросы на сервер, и если в определенный квант времени что-то там случилось, сообщайте клиенту. Иначе никак, инициатором обмена с сервером всегда является клиент, а не наоборот. Наоброт, это только резиндентное ПО у клиента, но это уже нечто другое. | |
|
|
|
|
|
|
|
для: sim5
(06.06.2009 в 15:18)
| | Мы привыкли работать по инициативе (требование безопасности для быстротекущих технологических процессов) и переходить на опросный метод (клиент все время опрашивает сервер) не только «не красиво» и создает лишнюю алгоритмическую волокиту, но и просто не приветствуется заказчиками, уже приученных к таким понятиям как приоритетный процесс и процесс реального времени (это когда приоритетный процесс все остальные процессы отодвигает в сторону и начинает выполнять срочное задание).
Может все-таки как-то можно получить в JavaScript то, что ему послал сервер? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 15:27)
| | >Может все-таки как-то можно получить в JavaScript то, что ему послал сервер?
Как? Как вы что-то подключите у клиента по "инициативе" сервера, о которой клиент ни рылом, ни духом...? | |
|
|
|
|
|
|
|
для: sim5
(06.06.2009 в 15:33)
| | Может, по каким американским сайтам походить, они все это разрабатывали, должны в точности знать все возможности? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 15:27)
| | Может я не понимаю что вы хотите, но поставьте заказчику сервер и пусть они общаются с другим сервером когда им вздумается, выступая то в роли клиента, то сервера. | |
|
|
|
|
|
|
|
для: Valick
(06.06.2009 в 15:37)
| | Два сервера (две задачи) могут взаимодействовать по инициативе, это не проблема. Проблема с оператором, который взаимодействует не с одним из серверов, а с браузером. Как ему что-то сообщить в порядке инициативы, а не в порядке его постоянного опроса одного из серверов. | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 15:43)
| | Я уже даже и не знаю, что вам ответь.... НИЗЗЯ! Так как это вы себе представляете - НИЗЗЯ! | |
|
|
|
|
|
|
|
для: sim5
(06.06.2009 в 15:55)
| | Хорошо, не специалист в Интернете, но вот вам логическая цепочка рассуждений – когда пользователь через браузер выходит в Интернет, ему присваивается IP. Зачем? Так как TCP/IP асинхронный протокол (синхронный или опросный протокол тут же сожрал бы кучу ресурсов Интернета), то не только браузер что-то посылает, но и ему обязаны что-то присылать, это единственный способ существования асинхронного протокола, адрес должен быть у обоих, и у сервера, и у клиента. Т.е. браузеру все-таки что-то посылается? И он на что-то реагирует? Следовательно, на браузер можно воздействовать со стороны сервера? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 16:22)
| | На браузер вы никак не сможете воздействовать - браузер делает запрос и получает ответ с сервера. Асинхронный это означает не воздействие, а способ передачи данных, грубо говоря, это означает, что передача данных происходит независимо от основного процесса, не синхронно с ним.
Как только сервер отдаст все, что запросил браузер, он тут же забывает о клиенте. Но, если ему захочеться по собственной инициативе что-то дополнительно передать браузеру, сверх того о чем его просили, браузер уже реагировать не будет. Реагировать на "инциативу" сервера в этом случе сможет, например, Касперский, сообщив об атаке на компьютер клиента.
Вы видимо знаете, что Windows XP может обеспечить удаленное управление компьютером, например, получить доступ к рабочему столу. Но это работает соответсвующая служба ОС (резедентное ПО), вот в таком ключе, имея свое ПО установленное у клиента, вы еще сможете достучаться до него по "инициативе" сервера. К примеру, так по сети управляются камеры видеонаблюдения. | |
|
|
|
|
|
|
|
для: sim5
(06.06.2009 в 16:46)
| | «Дополнительное ПО» это невыход. У нас был вариант – Java на сервере, Java у клиента. Но мы с радостью выбросили это, и перешли для визуализации у клиента на браузер, так как это проще – выкинули пол пакета, на основе чего раньше делали визуализацию. | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 15:43)
| | Вот я, например, работаю с провайдером через его прокси.
Т.е. у меня - динамический IP.
Что означает, что загружаю я какой-то документ с вашего сервера, имея, например, IP 123.45.67.890, а после окончания загрузки этого документа провайдер мгновенно "перекинет" меня на IP 123.45.67.067. А предыдущее значение IP "перейдёт" какому-то другому клиенту этого же провайдера.
Кому будет посылать свою "инициативу" ваш сервер, запомнивший адрес моего запроса?
На деревню дедушке? :-) | |
|
|
|
|
|
|
|
для: PAT
(06.06.2009 в 16:10)
| | А мне казалось, что временный IP назначается когда входишь в Интернет и не меняется, пока не отключишься. Уточните, пожалуйста. Новый IP назначается для каждой новой сессии? А не назначается провайдером на все время работы в Интернете, пока не отключились от Интернета? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 16:38)
| | >"Новый IP назначается для каждой новой сессии?"
Нет. Сессии, ИМХО, тут вовсе не причём.
Я не специалист по TSP/IP-технологиям, потому могу говорить только о своих визуальных наблюдениях.
Например, если я зайду на страницу http://2ip.ru/, меня там определят как 123.45.67.890
При каждом обновлении этой страницы (хоть при ежесекундном) я буду видеть свой новый IP. И он
практически всякий раз будет иным. Разумеется - в пределах диапазона адресов моего провайдера.
Вот данные за последние пять нажатий на кнопку "Обновить" браузера (последняя группа IP-адреса):
ххх.ххх.хх.202
ххх.ххх.хх.204
ххх.ххх.хх.219
ххх.ххх.хх.251
ххх.ххх.хх.209
|
| |
|
|
|
|
|
|
|
для: PAT
(06.06.2009 в 21:14)
| | Странно, зашел на http://2ip.ru/ несколько раз, и все время один и тот же адрес
Может, потому что у меня ADSL-модем? | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 22:44)
| | Дело не в модеме, дело в провайдере, о чём я вам уже писал ранее, а вы не поняли.
У меня тоже ADSL-модем. | |
|
|
|
|
|
|
|
для: 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
Как достучаться до браузера (чтобы он хоть как-то прореагировал) ума не приложу. | |
|
|
|
|
|
|
|
для: K
(07.06.2009 в 01:11)
| | достукивайтесь браузером до локального сервера с нужной Вам частотой
а локальным сервером "ловите" откуда угодно то что нужно | |
|
|
|
|
|
|
|
для: K
(07.06.2009 в 01:11)
| | А вот ещё идея...
по образу и подобию автозапуска дисков (например CHIP-DVD) когда вставляете диск в привод запускается браузер с нужной страницей.
локальным вебсервером Вы принимаете данные формируете страницу и скармливаете её системе (правда придётся разрешить это делать серверу)
можно даже с этой страницы общаться с сервером инициатором напрямую, по средствам Аякса в течении допустим нескольких минут для приёма ещё каких нибудь данных | |
|
|
|
|
|
|
|
для: K
(07.06.2009 в 01:11)
| | Вот вы сами же пишите человеческое, а значит понимаете суть процесса, и в то же время несете невообразимое. Сервер не браузеру посылает пакеты свои, эти пакеты в фоновом режиме принимаются модемом и аккуратно помещаются в буфер, и любое заинтересованное приложение может их получить. Но для этого оно само должно следить за буфером, реагировать на его заполение и считывать. Сам же буфер не заставит браузер обратиться к нему. | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 15:43)
| | Вам не браузер нужен, а клиент типа аськи | |
|
|
|
|
|
|
|
для: Valick
(06.06.2009 в 16:14)
| | За идею воспользоваться протоколом OSCAR, большое спасибо. Обязательно проработаем как вариант. | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 12:39)
| | test | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: K
(06.06.2009 в 12:39)
| | *Воровато оглядываясь по сторонам*
Посмотрите в сторону .net, там можно писать службы, которые как раз выступают инициаторами. И если вам нужен проект с широкой и сложной бизнес-логикой, то .net - самое оно. | |
|
|
|