VRML WARS
Как это работает
Cерверная часть
Этот несложный ASP скрипт работает под MS IIS3.0+ или MS PWS3.0+.
Основная задача - синхронизация данных на клиентах, осуществляется через встроенный ASP-объект Application
*
.
<%@ LANGUAGE = JavaScript %> <% var SEPARATOR = "&"; var NO_MSG = "no messages"; var EMPTY = "empty"; var DISCONNECTED = "disconnected"; var NULL_POS = "0 0 0"; var NULL_ROT = "0 0 1 0"; var BUSY = -1; var TIMEOUT = 40; var MAX_USERS = 10; var NULL_FLAG = "0 0, 0 0, 0 0, 0 0"; var date_obj = new Date(); var cur_time = Math.round(date_obj.getTime() / 1000); write_header(); Application.Lock; // if Application doesn't exist, create Applications if (check_application("pos") == false) { var tmp_users_arr = new Array(MAX_USERS); var tmp_client_arr = new Array(MAX_USERS); var tmp_ts_arr = new Array(MAX_USERS); var tmp_pos_arr = new Array(MAX_USERS); var tmp_rot_arr = new Array(MAX_USERS); var tmp_chat_arr = new Array(MAX_USERS); var tmp_flags_arr = new Array(MAX_USERS); init_arrays(); update_applications(); } // if this is the first client request if (unescape(Request.QueryString("first_time")) == "true"){ // convert Applications to arrays var tmp_users_arr = split_application(Application("users")); var tmp_client_arr = split_application(Application("client")); var tmp_ts_arr = split_application(Application("ts")); var tmp_pos_arr = split_application(Application("pos")); var tmp_rot_arr = split_application(Application("rot")); var tmp_chat_arr = split_application(Application("chat")); var tmp_flags_arr = split_application(Application("flags")); // check for TIMEOUT for (i = 0; i < MAX_USERS; ++i){ if (timeout(i) == true) disconnect(i); } // if there is free bay create new user account and post to client his usr_id var usr_id = find_free_element(); if ( usr_id >= 0){ tmp_users_arr[usr_id] = unescape(Request.ServerVariables("REMOTE_ADDR")); tmp_client_arr[usr_id] = unescape(Request.QueryString("client")).toLowerCase( ); tmp_ts_arr[usr_id] = cur_time; write_vrml(usr_id, tmp_pos_arr, tmp_rot_arr, tmp_chat_arr, tmp_client_arr, tmp_flags_arr); } // else server is busy else{ write_vrml(BUSY, tmp_pos_arr, tmp_rot_arr, tmp_chat_arr, tmp_client_arr, tmp_flags_arr); } // update Applications update_applications(); } // if this is not the first client request else if (unescape(Request.QueryString("first_time")) == "false"){ // convert Applications to arrays var tmp_users_arr = split_application(Application("users")); var tmp_client_arr = split_application(Application("client")); var tmp_ts_arr = split_application(Application("ts")); var tmp_pos_arr = split_application(Application("pos")); var tmp_rot_arr = split_application(Application("rot")); var tmp_chat_arr = split_application(Application("chat")); var tmp_flags_arr = split_application(Application("flags")); // check for TIMEOUT for (i = 0; i < MAX_USERS; ++i){ if (timeout(i) == true) disconnect(i); } // get usr_id var usr_id = parseInt(unescape(Request.QueryString("usr_id"))); // update client data if (tmp_client_arr[usr_id] != DISCONNECTED){ tmp_ts_arr[usr_id] = cur_time; tmp_pos_arr[usr_id] = unescape(Request.QueryString("pos")); tmp_rot_arr[usr_id] = unescape(Request.QueryString("rot")); tmp_chat_arr[usr_id] = unescape(Request.QueryString("chat")); tmp_flags_arr[usr_id] = unescape(Request.QueryString("flags")); } // post to client all datas write_vrml(usr_id, tmp_pos_arr, tmp_rot_arr, tmp_chat_arr, tmp_client_arr, tmp_flags_arr); // update Applications 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(){ init_array(tmp_users_arr, EMPTY, MAX_USERS); init_array(tmp_client_arr, DISCONNECTED, MAX_USERS); init_array(tmp_ts_arr, 0, MAX_USERS); init_array(tmp_pos_arr, NULL_POS, MAX_USERS); init_array(tmp_rot_arr, NULL_ROT, MAX_USERS); init_array(tmp_chat_arr, NO_MSG, MAX_USERS); init_array(tmp_flags_arr, NULL_FLAG, MAX_USERS); } function init_array(arr, val, maxval){ for (i = 0; i < maxval; ++i){ arr[i] = val; } } function split_application(val){ var s; s = val.split(SEPARATOR); return(s); } function find_free_element(){ for (i = 0; i < MAX_USERS; ++i){ if (tmp_client_arr[i] == DISCONNECTED) return(i); } return(-1); } function update_applications(){ update_application(tmp_users_arr, "users"); update_application(tmp_client_arr, "client"); update_application(tmp_pos_arr, "pos"); update_application(tmp_rot_arr, "rot"); update_application(tmp_chat_arr, "chat"); update_application(tmp_ts_arr, "ts"); update_application(tmp_flags_arr, "flags"); } function update_application(tmp_arr, app){ var tmp_str = tmp_arr.join(SEPARATOR); Application(app) = tmp_str; } function timeout(val){ if (cur_time - tmp_ts_arr[val] > TIMEOUT) return(true); else return(false); } function disconnect(val){ if (tmp_client_arr[val] != DISCONNECTED){ tmp_client_arr[val] = DISCONNECTED; tmp_users_arr[val] = EMPTY; tmp_pos_arr[val] = NULL_POS; tmp_rot_arr[val] = NULL_ROT; tmp_chat_arr[val] = NO_MSG; tmp_ts_arr[val] = 0; } } function write_header(){ Response.Expires = 0; 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 SFInt32 uid 0"); Response.Write("\n"); Response.Write(" exposedField MFVec3f translation []"); Response.Write("\n"); Response.Write(" exposedField MFRotation rotation []"); Response.Write("\n"); Response.Write(" exposedField MFString string1 []"); Response.Write("\n"); Response.Write(" exposedField MFString string2 []"); Response.Write("\n"); Response.Write(" exposedField MFVec2f flags []"); Response.Write("\n"); Response.Write("]{Group{}}"); Response.Write("\n"); } function write_vrml(uid, translation, rotation, string1, string2, flags){ uid = uid.toString(); translation = translation.toString(); rotation = rotation.toString(); for (i = 0; i < string1.length; ++i){ if (string1[i].indexOf("\"") == -1) string1[i] = "\"" + string1[i] + "\" "; } string1 = string1.toString(); for (i = 0; i < string2.length; ++i){ if (string2[i].indexOf("\"") == -1) string2[i] = "\"" + string2[i] + "\" "; } string2 = string2.toString(); Response.Write("_element_ {"); Response.Write("\n"); Response.Write(" uid " + uid); Response.Write("\n"); Response.Write(" translation [" + translation + "]"); Response.Write("\n"); Response.Write(" rotation [" + rotation + "]"); Response.Write("\n"); Response.Write(" string1 [" + string1 + "]"); Response.Write("\n"); Response.Write(" string2 [" + string2 + "]"); Response.Write("\n"); Response.Write(" flags [" + flags + "]"); Response.Write("\n"); Response.Write("}"); Response.Write("\n"); } %>
*
Подробности можно посмотреть на сайте
MSDN
.
BACK