我有一个使用无线接收器的任务,需要的不仅仅是jQuery的get / post功能.
由于跨域问题,这个jQuery得到了在Aptana IDE中创建的Adobe Air App中执行.
它必须是adobe air,因为Web服务器不会接近无线接收器最终连接的位置.
所以我需要一个可以与2KNow Renaissance无线接收器通信的应用程序.
我已经创建了一个应用程序来完成一些通信.这是我到目前为止可以采取的步骤.
>连接到接收器
>查看有多少手持设备连接到接收器
>然后应该有一些来回传播,至少在我的知识中,这在ajax中并不容易.
这是我一直在使用的代码,这是关于第24版,这是我已经得到的.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>2KNow Wireless Communicator</title>
</head>
<body>
<h1>Current Status/Prograess</h1>
<!--- step 1. is server connected --->
<div id="server_status" style="font-size:12px;"></div>
<!--- step 2. list number of devices connected --->
<div id="device_count" style="font-size:12px;"></div>
<div id="device_info" style="font-size:12px;"></div>
<!--- step 3.a Service Handler handler status / csh = Service Handler handler --->
<div id="csh_status" style="font-size:12px;"></div>
<!--- step 3.b disconnect status handler handler of many handlers --->
<div id="dis_status" style="font-size:12px;"></div>
<!--- step 4. test sending a question to a device --->
<div id="post_results" style="font-size:12px;"></div>
<!-- load the local jquery -->
<script type="text/javascript" src="lib/jquery/jquery-1.4.2.js"></script>
<script type="text/javascript" src="lib/jquery/json_parse.js"></script>
<script type="text/javascript" src="lib/jquery/jparse.min.js"></script>
<script type="text/javascript" src="lib/air/AIRAliases.js"></script>
<script type="text/javascript" src="lib/air/AIRIntrospector.js" />
<!-- Include service monitor framework -->
<script type="application/x-shockwave-flash" src="lib/air/servicemonitor.swf"></script>
<script type="text/javascript">
function watch_connection() {
// do ajax get
$.ajax({
type: "GET",datatype: "xml",url: "http://my_ip_address:port/Services/ConnectServiceHandler",success: function(response){
$('#post_results').html(response);
},error:function (xhr,ajaxOptions,thrownError){
$('#post_results').html("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
}
});
setTimeout(function(){watch_connection;},100);
}
function disconnect_service_handler() {
// step 1. create xml document of data to send
var xml_string = '<data><disconnect_handler service="64"/></data>';
// step 2. post this to the registration service
$.ajax({
type: "POST",url:"http://my_ip_address:port/Services/disconnectServiceHandler",data: xml_string,beforeSend: function(xhr){
xhr.withCredentials = true;
},timeout: (2 * 1000),success: function(response){
// parse the response
$(response).find("status").each(function() {
// get the status code
var disconnect_status = $(this).attr('code');
if (disconnect_status == 200) {
// change status bar message
$('#dis_status').html('disconnecting: [200 disconnected]');
// call connection using new guid
var my_guid = guid();
connect_service_handler(my_guid);
}
if (disconnect_status == 304) {
// change status bar message
$('#dis_status').html('disconnecting: [304 No handler found]');
}
if (disconnect_status == 400) {
// change status bar message
$('#dis_status').html('disconnecting: [400 Bad Request]');
}
if (disconnect_status == 401) {
// change status bar message
$('#dis_status').html('disconnecting: [401 Not Found]');
}
if (disconnect_status == 500) {
// change status bar message
$('#dis_status').html('disconnecting: [500 Internal Server Failure]');
}
if (disconnect_status == 501) {
// change status bar message
$('#dis_status').html('disconnecting: [503 Service Unavailable]');
}
});
},thrownError){
$('#dis_status').html('disconnecting: [disconnect Failure]');
}
});
}
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
function connect_service_handler(my_guid) {
// step 1. create xml document of data to send
var xml_string = '<data><connect_handler service="64"><application id="'+my_guid+'" name="MikesBigEar" /></connect_handler></data>';
// step 2. post this to the registration service
$.ajax({
type: "POST",url:"http://my_ip_address:port/Services/ConnectServiceHandler",success: function(response){
// parse the response
$(response).find("status").each(function() {
// get the status code
var connection_status = $(this).attr('code');
if (connection_status == 200) {
// change status bar message
$('#csh_status').html('Service Handler: [200 Connected]');
// keep connection open keep socket alive
// sends http request to us via post
// sends the incoming request id and device address back to make sure it goes to the correct device
// ask for user id or user authentication
// for user authentication can either use built-in user authentication or ask a question
// http 1.1 keep alive header
$('#post_results').html('Attempting to check for next piece of data...');
watch_connection();
}
if (connection_status == 303) {
// change status bar message
$('#csh_status').html('Service Handler: [303 The handler is assigned to another application]');
var my_guid = guid();
connect_service_handler(my_guid);
}
if (connection_status == 400) {
// change status bar message
$('#csh_status').html('Service Handler: [400 Bad Request]');
disconnect_service_handler();
}
if (connection_status == 401) {
// change status bar message
$('#csh_status').html('Service Handler: [401 Not Found]');
disconnect_service_handler();
}
if (connection_status == 500) {
// change status bar message
$('#csh_status').html('Service Handler: [500 Internal Server Failure]');
disconnect_service_handler();
}
if (connection_status == 501) {
// change status bar message
$('#csh_status').html('Service Handler: [501 Service Unavailable]');
disconnect_service_handler();
}
});
// pass the xml to the textarea
// $('#process').val('ConnectServiceHandler');
// $('#show_errors_here').val(response);
},thrownError){
$('#csh_status').html('Service Handler: [Connection Failure]');
// alert("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
// alert("responseText: "+xhr.responseText);
// alert(xhr.status);
// alert(thrownError);
}
});
// set timed re-check and store it
// setTimeout(function(){connect_service_handler(my_guid);},8000);
}
function get_device_count(my_guid) {
// get the total number of devices
// default receiver status
var receiver_status = '';
$('#device_count').html('Device Count: [Checking...]');
$('#device_info').html('');
// get the wireless receiver status via ajax xml
$.ajax({
type: "GET",url:"http://my_ip_address:port/Services/GetDevices",success: function(response){
$(response).find("status").each(function() {
// get the status code
var receiver_status = $(this).attr('code');
if (receiver_status == 200) {
// change status bar message
$('#device_count').html('Device Count: [200 Connected]');
}
if (receiver_status == 400) {
// change status bar message
$('#device_count').html('Device Count: [400 Bad Request]');
}
if (receiver_status == 401) {
// change status bar message
$('#device_count').html('Device Count: [401 Not Found]');
}
if (receiver_status == 500) {
// change status bar message
$('#device_count').html('Device Count: [500 Internal Server Failure]');
}
if (receiver_status == 501) {
// change status bar message
$('#device_count').html('Device Count: [501 Service Unavailable]');
}
});
var device_count = 0;
// add to div
$('#device_info').append('<ul style="font-size:10px;">');
$(response).find("device").each(function() {
// get each property
var device_status = $(this).attr('status');
var short_address = $(this).attr('short_address');
var mac_address = $(this).attr('mac_address');
var pan_id = $(this).attr('pan_id');
var type = $(this).attr('type');
device_count = device_count + 1;
// get session data
$(this).find("session").each(function() {
// get session data
var created_date = $(this).attr('date');
var created_time = $(this).attr('time');
});
$('#device_info').append('<li style="list-style:none;">Device #'+device_count+'<ul>');
// add list item
$('#device_info').append('<li> Mac Address: ['+mac_address+']</li>');
$('#device_info').append('<li> Short Address: ['+short_address+']</li>');
$('#device_info').append('<li> Pan ID: ['+pan_id+']</li>');
$('#device_info').append('</ul></li><br/>');
// send request to this device
// post_live_activity(mac_address,my_guid);
});
// end list
$('#device_info').append('</ul>');
if (device_count === 0) {
$('#device_count').html('Device Count: [0 Devices Found]');
} else if (device_count > 0) {
$('#device_count').html('Device Count: [' + device_count + ' Devices Found]');
}
},thrownError){
$('#device_count').html('Device Count: [Connection Failure]');
// alert(xhr.status);
// alert(thrownError);
}
});
// set timed re-check and store it
setTimeout(function(){get_device_count(my_guid);},13000);
}
function get_server_status(my_guid) {
// default receiver status
var receiver_status = '';
// get the Renaissance Wireless Server via ajax xml
$.ajax({
type: "GET",url:"http://my_ip_address:port/Services/GetAccesspoints",success: function(response){
$(response).find("status").each(function() {
// get the status code
var receiver_status = $(this).attr('code');
if (receiver_status == 200) {
// change status bar message
$('#server_status').html('Renaissance Wireless Server: [200 Connected]');
// step 2. get device count
get_device_count(my_guid);
// step 3.part 1 get the guid to be used as the application id
// var my_guid = guid();
// step 3. part 2 connect to a service handler whatever that means
connect_service_handler(my_guid);
}
if (receiver_status == 400) {
// change status bar message
$('#server_status').html('Renaissance Wireless Server: [400 Bad Request]');
// set timed re-check and store it
setTimeout(function(){get_server_status(my_guid);},12300);
}
if (receiver_status == 401) {
// change status bar message
$('#server_status').html('Renaissance Wireless Server: [401 Not Found]');
// set timed re-check and store it
setTimeout(function(){get_server_status(my_guid);},12300);
}
if (receiver_status == 500) {
// change status bar message
$('#server_status').html('Renaissance Wireless Server: [500 Internal Server Failure]');
// set timed re-check and store it
setTimeout(function(){get_server_status(my_guid);},12300);
}
if (receiver_status == 501) {
// change status bar message
$('#server_status').html('Renaissance Wireless Server: [503 Service Unavailable]');
// set timed re-check and store it
setTimeout(function(){get_server_status(my_guid);},12300);
}
// pass the xml to the textarea
// $('#process').val('GetAccesspoints');
// $('#show_errors_here').val(response);
});
},thrownError){
$('#server_status').html('Renaissance Wireless Server: [Connection Failure]');
// alert(xhr.status);
// alert(thrownError);
}
});
// set timed re-check and store it
// setTimeout(function(){get_server_status(my_guid);},12300);
}
$(document).ready(function() {
// step 3.part 1 get the guid to be used as the application id
var my_guid = guid();
// step 1 validate
get_server_status(my_guid);
// step 2. get device count
get_device_count();
// step 3.part 1 get the guid to be used as the application id
// var my_guid = guid();
// step 3. part 2 connect to a service handler whatever that means
// connect_service_handler(my_guid);
});
</script>
</body>
</html>
我的问题是,我应该使用不同的jquery插件,还是我接近这个错误?
谢谢…
解决方法
要求jQuery进行套接字通信是我所知道的jQuery范围之外的. jQuery实际上只是使用XMLHttpRequest,它不适用于持久套接字.
想法1
那么使用ActionScript Socket类呢
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/Socket.html
你可以在你的html页面中嵌入flash电影并从javascript调用它
http://www.hariscusto.com/programming/communication-between-javascript-and-actionscript-as3-and-vice-versa/
想法2
您还可以考虑Web服务器上的node.js和大型socket.io模块,以利用空中的websockets,然后在air客户端和服务器之间进行双向通信.除服务器端支持外,socket.io还有一个很棒的浏览器客户端.见http://socket.io/
这是一篇关于联邦快递技术博客的一篇有趣的帖子,关于将jQuery与socket.io和node.js一起使用 – http://spiritconsulting.com.ar/fedex/2010/11/events-with-jquery-nodejs-and-socket-io/
创意3(新)
html air开发人员可以使用air javascript套接字类.我刚刚在这里偶然发现:
主页/ HTML开发人员指南,用于Adobe AIR /网络和通信
http://help.adobe.com/en_US/air/html/dev/WSb2ba3b1aad8a27b0-181c51321220efd9d1c-8000.html
根据您的需要,有几种不同的套接字apis