2010-11-08 17 views
9

đây là demo rằng một đơn giản chat client, bạn phải mở nó trên webkit trình duyệt như: chrome và Safari,làm thế nào tôi có thể tạo ra một WebSocket trên công cụ google app cho html5

bản demo sử dụng một máy chủ socket web dựa trên Node.js: WebSocket-server-Node.js,

nhưng tôi nghĩ rằng nó không thể triển khai trên công cụ google app,

nên bạn có biết làm thế nào để làm cho một WebSocket sử dụng python trên công cụ google app,

và chạy bản trình diễn trên đó,

nhờ

này là mã:

<!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> 
+2

bản sao có thể có của [Làm cách nào để chạy máy chủ WebSocket trên GAE?] (Http://stackoverflow.com/questions/4114902/how-can-i-run-a-websocket-server-on-top -of-gae) – systempuntoout

Trả lời

11

Tôi nghĩ bạn nên đợi cho Kênh API.

Kênh API - API Kênh phép bạn xây dựng các ứng dụng mà có thể đẩy nội dung trực tiếp vào trình duyệt người dùng của bạn (aka “Comet”). Không cần bỏ phiếu nhiều hơn để cập nhật!

điều này đã là một phần của SDK nhưng không hoạt động trong quá trình sản xuất.

Here một đoạn video cho thấy tính năng sắp tới mới này
Here một ứng dụng demo với nhiều người đố-quiz

EDIT:
sẵn với SDK 1.4.0

+0

có một số tài liệu về nó? tại sao tôi không thể tìm thấy nó trên doc của gae? – zjm1126

+0

Không, Google chưa chính thức phát hành nó, vì vậy nó vẫn không có giấy tờ (dù sao bạn có thể fiddle với nó trên dev_appserver. Hãy xem ứng dụng demo). – systempuntoout

+0

Điều này hiện đã được phát hành và được ghi lại: http://code.google.com/appengine/docs/python/channel/ –

0

Bạn có thể sử dụng một trong những Python dựa triển khai WebSocket máy chủ đó là trên mạng, nhưng bạn sẽ không làm cho nó xa với điều đó trên AppEngine vì nó yêu cầu dựa trên và mọi yêu cầu đều có thời lượng tối đa là 30 giây, bạn sẽ cần VPS hoặc thứ gì đó tương tự, nếu bạn muốn lưu trữ máy chủ trò chuyện và trong trường hợp đó, bạn cũng có thể chạy phiên bản Node.js.

Giới hạn AppEngine: http://code.google.com/appengine/docs/python/runtime.html#Quotas_and_Limits

4

Lưu ý rằng điều này hiện đã được phát hành: http://code.google.com/appengine/docs/python/channel/

Tận hưởng!

+0

Một FYI nhỏ cho những người muốn thử ví dụ: liên kết trên tổng quan về Java http://code.google.com/appengine/docs/java/channel/overview.html#Example_Tic_Tac_Toe_Application phải trỏ đến mã http: // .google.com/p/java-kênh-tic-tac-toe /. Ngoài ra, có một bản demo trực tiếp tại http://java-channel-tac-toe.appspot.com – ide

1

Có bạn có thể, như đã chỉ ra trong một chú thích về một câu hỏi liên quan: How can I run a WebSocket server on top of GAE?

Các chi tiết của việc thực hiện này mã sử dụng từ máy chủ ứng dụng Typhoon được trình bày chi tiết ở đây: https://code.google.com/p/typhoonae/wiki/WebSockets

Bạn có thể gặp khó khăn với 30 giây timeout vấn đề, nhưng như đã được chỉ ra ở nơi khác, bạn có thể gây ra khách hàng của bạn để kết nối lại với máy chủ mỗi 25 giây hoặc lâu hơn để duy trì một kết nối liên tục. Các trường hợp cạnh mà một phần thư được gửi đến nhiều hơn một ổ cắm có thể phức tạp nhưng phải giải quyết được.

Sử dụng Kênh có thể thích hợp hơn nếu bạn đang sử dụng Javascript cho ứng dụng khách, vì OP có vẻ như vậy. Websockets có thể dễ dàng hơn mặc dù nếu bạn có mã hiện tại đã sử dụng WS hoặc nếu bạn cần hỗ trợ các máy khách không phải JS mà chưa có hỗ trợ Channels.

Các vấn đề liên quan