|
我們?cè)趥鹘y(tǒng)的web程序當(dāng)中比較頭疼的一件事是屏幕的刷新感。雖然有server push的技術(shù),但在IE中較難實(shí)現(xiàn),F(xiàn)在webservice給了我們這樣一個(gè)機(jī)會(huì),大家都知道webservice是基于soap的,而soap是xml的應(yīng)用,如果你曾經(jīng)用過(guò)ms xml sdk3.0的話就會(huì)知道里面有個(gè)xmlhttp方法,其實(shí)在那時(shí)我們就已經(jīng)可以用xmlhttp的方式替代Form了,也是無(wú)刷新的,其實(shí)準(zhǔn)確地說(shuō)是局部刷新,下面我們來(lái)看一下怎樣做,先做一個(gè)chat webservice, 首先來(lái)分析一下,一個(gè)聊天室應(yīng)具備的兩個(gè)要素人和消息,這樣我們可以建立一個(gè)類型(記得我在以前說(shuō)過(guò)類也是類型),它包含這樣兩個(gè)要素。 ///ChatMessage.cs using System;
namespace chat { /// <summary> /// ChatMessage類封裝了兩個(gè)string變量:UserLists--用戶列表,Messages--要傳遞的信息 /// </summary> public class ChatMessage { public string UserList, Messages; } } 第二個(gè)我們要建立的是什么呢?一個(gè)聊天室應(yīng)能存儲(chǔ)在線成員的名字及訪問(wèn)時(shí)間 ///Member.cs using System;
namespace chat { /// <summary> /// Member類為每個(gè)聊天者封裝了Server端的變量 /// </summary> public class Member { // 存儲(chǔ)消息的隊(duì)列 public string UserName, MsgQueue; // 判斷滯留事件以便踢人 public System.DateTime LastAccessTime; // The constructor public Member(string NickName) { this.UserName=NickName; this.LastAccessTime=DateTime.Now; } } }
接下來(lái)我們就應(yīng)該做這個(gè)asmx了 ///ChatWebService.asmx using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services;
namespace chat { /// <summary> /// Summary description for ChatWebService. /// </summary> [WebService (Namespace = "http://localhost/chat/", Description = "This service provides an chat service")] public class ChatWebService : System.Web.Services.WebService { public ChatWebService() { //CODEGEN: This call is required by the ASP.NET Web Services Designer InitializeComponent(); }
#region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { } #endregion
/// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { }
[WebMethod(Description="接收用戶名作為參數(shù)存儲(chǔ)到Application對(duì)象中")] public string Login(string username) { // Ascertain that all the registered chat participants are active CheckMembersList(); // Synchronization Lock Application.Lock(); // Get the collection of keys for the Application Variables String[] Members = Application.AllKeys; // Are there any registered chat members? & the present request is for a unique nick name? if ((Members.Length>0)&&(Array.IndexOf(Members,username)>-1)) { throw new Exception("該用戶已存在!"); } // Create a new Member object for this participant Member NewMember = new Member(username); // Add this new member to the collectionof Application Level Variables Application.Add(username, NewMember); // Synchronization unlock Application.UnLock(); // Go and get the list of current chat participants and retrun the list return GetMembersList(); }
[WebMethod(Description="GetMsg方法用用戶名和消息為參數(shù)返回一個(gè)ChatMessage對(duì)象,包括要傳遞的消息和用戶列表")] public ChatMessage XchangeMsgs(string username, string Msg) { // Ascertain that all the registered chat participants are active CheckMembersList(); // Synchronization Lock Application.Lock(); // Get the collection of keys for the Application Variables String[] Members = Application.AllKeys; if ((Members.Length==0)||(Array.IndexOf(Members,username)==-1)) // Are there any registered chat members? & the present request is for a unique nick name? { throw new Exception("你當(dāng)前可能沒(méi)有登陸或登陸超時(shí),請(qǐng)重新登陸!"); } ChatMessage RetMsg = new ChatMessage();
RetMsg.UserList = GetMembersList(); // Loop through all the Chat Participant's serverside Member Objects and // add the message just received in their waiting message queue for (int x=0;x<Members.Length;x++) { Member temp = (Member)Application[Members[x]]; temp.MsgQueue+=("<BR><Font color = Red>" + username + " 說(shuō):<BR></FONT><Font color = Blue>" + Msg); if (temp.UserName == username) { RetMsg.Messages = temp.MsgQueue; temp.MsgQueue=""; temp.LastAccessTime=DateTime.Now; } } // Synchronization unlock Application.UnLock(); return RetMsg; }
[WebMethod(Description="GetMsg方法用username為參數(shù)返回一個(gè)ChatMessage對(duì)象,包括要傳遞的消息和用戶列表")] public ChatMessage GetMsgs(string username) { Application.Lock(); CheckMembersList(); Application.Lock(); String[] Members = Application.AllKeys; if ((Members.Length==0)||(Array.IndexOf(Members,username)==-1)) { throw new Exception("Unknown User. Please Login with a UserName"); } ChatMessage RetMsg = new ChatMessage(); RetMsg.UserList = GetMembersList(); Member temp = (Member)Application[username]; RetMsg.Messages = temp.MsgQueue; temp.MsgQueue=""; temp.LastAccessTime=DateTime.Now; Application.UnLock(); return RetMsg; }
public string GetMembersList() { Application.Lock(); String UserList = ""; String[] Members = Application.AllKeys; Application.UnLock(); for (int x=0;x<Members.Length;x++) { Member temp = (Member)Application[Members[x]]; UserList += (temp.UserName+"\n"); } return UserList; }
private void CheckMembersList() { String[] Members = Application.AllKeys; ArrayList RemoveList = new ArrayList(); for (int x=0;x<Members.Length;x++) { Member temp = (Member) Application[Members[x]]; int test = (DateTime.Now.Subtract(temp.LastAccessTime)).Minutes; if (test > 2) { RemoveList.Add(Members[x]); } } // Users = null; for (int count = 0;count<RemoveList.Count;count++) { Application.Remove((String)RemoveList[count]); } return; }
&nb
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!