VRML CHESS
Как это работает
ASP скрипт
Этот несложный скрипт работает под MS IIS3.0+ или MS PWS3.0+.
Основная задача - синхронизация данных на клиентах, осуществляется через встроенный ASP-объект Application
*
.
<%@ LANGUAGE = JavaScript %> <% var SEPARATOR = "&"; var SEPARATOR2 = ","; var DISCONNECTED = "-1"; var BUSY = "-1"; var EMPTY = "-1"; var MAX_USERS = 10; var MAX_DATAS = 10; var TIMEOUT = 60; var MAX_GAME_NAME = 16; var date_obj = new Date(); var cur_time = Math.round(date_obj.getTime() / 1000); var game_name = unescape(Request.QueryString("game_name")); if (game_name == "undefined") Response.End; if (game_name.length > MAX_GAME_NAME) Response.End; game_name = game_name + "_data" Application.Lock; // если объект Application не существует сделать массивы, проинициализировать их disconnect-ами и сделать из них Application if (check_application(game_name) == false) { var tmp_data_arr = new Array(MAX_USERS); init_arrays(); update_applications(); } write_header(); // если это первое обращение клиента if (unescape(Request.QueryString("first_time")) == "true"){ // разбить все Application на массивы var tmp_data_arr = split_application(Application(game_name)); // проверить все ts на TIMEOUT и если таковые найдутся, то disconnect for (i = 0; i < MAX_USERS; ++i){ if (timeout(i) == true) disconnect(i); } // если есть свободный элемент прописать в него users, client, ts = cur_time и сообщить клиенту его usr_id var usr_id = find_free_element(); if ( usr_id >= 0){ tmp_data_arr[usr_id][tmp_data_arr[usr_id].length - 1] = cur_time; write_vrml(usr_id); } // иначе выдать сообщить клиенту, что сервер переполнен else{ write_vrml(BUSY); } // слить всё в Application (с разделителями) update_applications(); } // если это не первое обращение клиента else if (unescape(Request.QueryString("first_time")) == "false"){ // разбить все Application на массивы var tmp_data_arr = split_application(Application(game_name)); // проверить все ts на TIMEOUT и если таковые найдутся, то disconnect for (i = 0; i < MAX_USERS; ++i){ if (timeout(i) == true) disconnect(i); } // считать usr_id из запроса var usr_id = parseInt(unescape(Request.QueryString("usr_id"))); // если клиент ещё не disconnected, то установить для него новые данные if (tmp_data_arr[usr_id][tmp_data_arr[usr_id].length - 1] != DISCONNECTED){ tmp_data_arr[usr_id][tmp_data_arr[usr_id].length - 1] = cur_time; var tmp_arr = new Array(); var tmp_str = ""; tmp_str = unescape(Request.QueryString("data")); tmp_arr = tmp_str.split(SEPARATOR2); var tmp_len = tmp_arr.length; for (i = 0; i < tmp_len; ++i){ tmp_data_arr[usr_id][i] = tmp_arr[i]; } tmp_data_arr[usr_id][tmp_data_arr[usr_id].length - 1] = cur_time; } // сообщить клиенту данные о всех элементах write_vrml(tmp_data_arr); // слить всё в Application (с разделителями) update_applications(); } Application.Unlock; %> <% function check_application(val){ var tmp_str = ""; tmp_str += Application(val); if (tmp_str == "undefined") return(false); else return(true); } function init_arrays(){ for (i = 0; i < MAX_USERS; ++i){ tmp_data_arr[i] = new Array(MAX_DATAS); for (j = 0; j < MAX_DATAS; ++j){ tmp_data_arr[i][j] = EMPTY; } } } function split_application(val){ var tmp_arr1 = new Array(); var tmp_arr2 = new Array(); tmp_arr1 = val.split(SEPARATOR); var tmp_len = tmp_arr1.length; for (i = 0; i < tmp_len; ++i){ tmp_arr2 = tmp_arr1[i].split(SEPARATOR2); tmp_arr1[i] = tmp_arr2; } return(tmp_arr1); } function find_free_element(){ for (i = 0; i < MAX_USERS; ++i){ if (tmp_data_arr[i][tmp_data_arr[i].length - 1] == DISCONNECTED) return(i); } return(-1); } function update_applications(){ var tmp_str = ""; var tmp_len = tmp_data_arr.length; for (i = 0; i < tmp_len; ++i){ tmp_str = tmp_data_arr[i].join(SEPARATOR2); tmp_data_arr[i] = tmp_str; } tmp_str = tmp_data_arr.join(SEPARATOR); Application(game_name) = tmp_str; } function timeout(val){ if (cur_time - tmp_data_arr[val][tmp_data_arr[val].length - 1] > TIMEOUT) return(true); else return(false); } function disconnect(val){ if (tmp_data_arr[val][tmp_data_arr[val].length - 1] != DISCONNECTED){ for (i = 0; i < MAX_DATAS; ++i){ tmp_data_arr[val][i] = EMPTY; } } } function write_header(){ Response.Expires = 0; Response.CacheControl = "Public"; Response.ContentType = "x-world/x-vrml"; Response.Write("#VRML V2.0 utf8"); Response.Write("\n"); Response.Write("PROTO _element_ ["); Response.Write("\n"); Response.Write("exposedField MFString string1 []"); Response.Write("\n"); Response.Write("]{Group{}}"); Response.Write("\n"); } function write_vrml(val){ if (val.length) { var tmp_len = val.length; var tmp_str = ""; for (i = 0; i < tmp_len; ++i){ tmp_str = tmp_str + "\"" + val[i].toString() + "\"," } } else { var tmp_str = ""; tmp_str = tmp_str + "\"" + val.toString() + "\"" } Response.Write("_element_ {"); Response.Write("\n"); Response.Write("string1 [" + tmp_str + "]"); Response.Write("\n"); Response.Write("}"); Response.Write("\n"); } %>
*
Подробности можно посмотреть на сайте
MSDN
.
BACK