Как я могу создать веб-сокет на Google App Engine для HTML5 - PullRequest
9 голосов
/ 08 ноября 2010

это демо , что простой клиент чата, вы должны открыть его в веб-браузере, например: Chrome и Safari,

демонстрационная версия использует сервер веб-сокетов на основе node.js: websocket-server-node.js,

но я думаю, что не могу развернуть на google app engine,

так вы знаете, как создать веб-сокет с помощью python в google app engine,

и запуск демонстрации на нем,

спасибо

это код:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=620" />
<title>HTML5 Demo: Web Socket</title>
<link rel="stylesheet" href="http://html5demos.com/css/html5demos.css" type="text/css" />
<script src="http://html5demos.com/js/h5utils.js"></script></head>
<body>
<section id="wrapper">
    <header>
      <h1>Web Socket</h1>
    </header>
<style>
#chat { width: 97%; }
.them { font-weight: bold; }
.them:before { content: 'them '; color: #bbb; font-size: 14px; }
.you { font-style: italic; }
.you:before { content: 'you '; color: #bbb; font-size: 14px; font-weight: bold; }
#log {
  overflow: auto;
  max-height: 300px;
  list-style: none;
  padding: 0;
/*  margin: 0;*/
}
#log li {
  border-top: 1px solid #ccc;
  margin: 0;
  padding: 10px 0;
}
</style>
<article>
  <form>
    <input type="text" id="chat" placeholder="type and press enter to chat" />
  </form>
  <p id="status">Not connected</p>
  <p>Users connected: <span id="connected">0</span></p>
  <p>To test, open two windows with Web Socket support, type a message above and press return.</p>
  <p>The server side code is available here: <a href="http://github.com/remy/html5demos/tree/master/server/">node-web-socket & server</a> (note that it runs on <a href="http://nodejs.org/" title="node.js">nodejs</a>)</p>
  <ul id="log"></ul>
</article>
<script>
function openConnection() {
  // uses global 'conn' object
  if (conn.readyState === undefined || conn.readyState > 1) {
    conn = new WebSocket('ws://node.remysharp.com:8001');    
    conn.onopen = function () {
      state.className = 'success';
      state.innerHTML = 'Socket open';
    };

    conn.onmessage = function (event) {
      var message = JSON.parse(event.data);
      if (typeof message == 'string') {
        log.innerHTML = '<li class="them">' + message.replace(/[<>&]/g, function (m) { return entities[m]; }) + '</li>' + log.innerHTML;
      } else {
        connected.innerHTML = message;
      }
    };

    conn.onclose = function (event) {
      state.className = 'fail';
      state.innerHTML = 'Socket closed';
    };
  }
}

var connected = document.getElementById('connected'),
    log = document.getElementById('log'),
    chat = document.getElementById('chat'),
    form = chat.form,
    conn = {},
    state = document.getElementById('status'),
    entities = {
      '<' : '<',
      '>' : '>',
      '&' : '&'
    };


if (window.WebSocket === undefined) {
  state.innerHTML = 'Sockets not supported';
  state.className = 'fail';
} else {
  state.onclick = function () {
    if (conn.readyState !== 1) {
      conn.close();
      setTimeout(function () {
        openConnection();
      }, 250);
    }
  };

  addEvent(form, 'submit', function (event) {
    event.preventDefault();

    // if we're connected
    if (conn.readyState === 1) {
      conn.send(JSON.stringify(chat.value));
      log.innerHTML = '<li class="you">' + chat.value.replace(/[<>&]/g, function (m) { return entities[m]; }) + '</li>' + log.innerHTML;

      chat.value = '';
    }
  });

  openConnection();  
}

</script>    <footer><a href="/">HTML5 demos</a>/<a id="built" href="http://twitter.com/rem">@rem built this</a>/<a href="#view-source">view source</a></footer> 
</section>
<a href="http://github.com/remy/html5demos"><img style="position: absolute; top: 0; left: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png" alt="Fork me on GitHub" /></a>

</body>
</html>

Ответы [ 4 ]

11 голосов
/ 08 ноября 2010

Я думаю, вам следует подождать Channel API .

Channel API - Channel API позволяет создавать приложения, которые могут выдвигать содержание непосредственно для ваших пользователей браузер (он же «Комета»). Нет больше опросов для обновлений!

это уже часть SDK, но не работает на производстве.

Здесь видео, показывающее эту новую предстоящую функцию
Здесь Демо-приложение с многопользовательской викториной

EDIT:
доступно с SDK 1.4.0

4 голосов
/ 05 декабря 2010

Обратите внимание, что это было выпущено: http://code.google.com/appengine/docs/python/channel/

Наслаждайтесь!

1 голос
/ 15 мая 2013

Да, вы можете, как было указано в комментарии к связанному вопросу: Как мне запустить сервер WebSocket поверх GAE?

Подробности реализации этого с использованием кода с сервера приложений Typhoon приведены здесь: https://code.google.com/p/typhoonae/wiki/WebSockets

У вас могут возникнуть проблемы с 30-секундным тайм-аутом, но, как указывалось в другом месте, вы можете заставить клиента повторно подключаться к серверу каждые 25 секунд или около того, чтобы сохранить постоянное соединение. Пограничные случаи, когда частичные сообщения отправляются более чем в один сокет, могут быть сложными, но должны быть решаемыми.

Использование каналов, вероятно, предпочтительнее, если вы используете Javascript для клиента, как кажется с OP. Websockets может быть проще, хотя, если у вас есть существующий код, который уже использует WS, или если вам нужно поддерживать не-JS клиенты, которые еще не поддерживают Channels.

0 голосов
/ 08 ноября 2010

Вы могли бы использовать одну из реализаций WebSocket Server на основе Python, но вы не сможете продвинуться далеко вперед с этим в AppEngine, поскольку он основан на запросах и каждый запрос имеет максимальное время жизни 30 секунд, вам потребуетсяVPS или что-то подобное, если вы хотите разместить сервер чата, и в этом случае вы также можете запустить версию Node.js.

AppEngine Limits: http://code.google.com/appengine/docs/python/runtime.html#Quotas_and_Limits

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...