2015-10-20 3 views
1

Я использую Channel API, и примерно через 1 минуту после открытия канала в терминале я вижуChannel апи: постоянные соединения и разъединения

INFO  2015-10-20 11:18:08,489 module.py:786] default: "POST /_ah/channel/disconnected/ HTTP/1.1" 200 2278 
2015/10/20 11:18:10 handlerMain executed 
INFO  2015-10-20 11:18:10,482 module.py:786] default: "POST /_ah/channel/connected/ HTTP/1.1" 200 2279 
2015/10/20 11:18:13 handlerMain executed 
INFO  2015-10-20 11:18:13,486 module.py:786] default: "POST /_ah/channel/disconnected/ HTTP/1.1" 200 2279 
2015/10/20 11:18:14 handlerMain executed 
INFO  2015-10-20 11:18:14,482 module.py:786] default: "POST /_ah/channel/connected/ HTTP/1.1" 200 2279 

и так далее ..

мой .go файл

func init() { 
    http.HandleFunc("/", handlerMain) 
} 
func handlerMain(w http.ResponseWriter, r *http.Request) { 
      log.Println("handlerMain executed") 

      c := appengine.NewContext(r) 
      tok, err := channel.Create(c, "123") 
      if err != nil { 
        panic(err) 
      } 
      templ := template.Must(template.ParseFiles("./templates/posts.html")) 
      err = templ.Execute(w, map[string]string{ 
        "token": tok, 
      }) 
      if err != nil { 
        panic(err) 
      } 
} 

Javascript из моего .html файла

<script> 
    channel = new goog.appengine.Channel('{{.token}}'); 
    socket = channel.open(); 
    socket.onopen = onOpened; 
    socket.onmessage = onMessage; 
    socket.onerror = onError; 
    socket.onclose = onClose; 
    </script> 

Если это простое уведомление, я мог бы обработать его, но это отключение повторяет функцию handlerMain(), и в этой функции я хочу запустить goroutine, который будет отправлять сообщения клиенту, в этом случае у меня будет несколько повторений сообщений на моей странице html.

Любые мысли? Есть ли альтернатива для Channel API? Я знаю, что WebSockets, к сожалению, не работает с GAE

UPDATE: В браузере я вижу GET запросы XMLHttpRequest отправляются каждый второй в

http://localhost:8080/_ah/channel/dev?command=poll&channel=237c7242478266a2856d947decce4b55-channel-2105948409-1445426965-123&client=1 

с заголовком Connection: «сохранить в живых»;

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

+1

Я не понимаю, чего вы пытаетесь достичь здесь (не знакомы с Go) или почему ваш основной обработчик для «/» называется по POST-запросам к маршрутам/_ah/channel/*. Отключение обычно происходит от перехода клиента на другую страницу или обновления страницы. Другими словами, если страница загружается, клиент будет вызывать/_ah/channel/connect, если страница «закрыта», клиент будет вызывать/_ah/channel/disconnect. Как правило, вы добавляете обработчик соединения и обработчик отключения в свое приложение, отличное от вашего handlerMain для «/». – Ani

+0

@ Ани. В этом случае я должен получать запросы на */connect и/disconnect только в ситуациях, о которых вы упомянули. В этом примере я успешно открываю канал и получаю один POST/_ah/channel/connect. Так что все хорошо. Но потом, через некоторое время (я ничего не делаю с веб-страницей, просто смотрю на это), соединения и разъединения начинают следовать друг за другом, как описано выше. Похоже, что у канала есть какой-то тайм-аут. – Kaign

+0

И да, handlerMain должен быть выполнен только после перезагрузки страницы, так что это еще одна проблема – Kaign

ответ

Смежные вопросы