繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> Asp.Net开发 >> 无刷新的聊天室的制作兼谈组件制作和ClientSide Script(一)

无刷新的聊天室的制作兼谈组件制作和ClientSide Script(一)

2007-06-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:我们在传统的web程序当中比较头疼的一件事是屏幕的刷新感。虽然有server push的技术,但在IE中较难实现。现在webservice给了我们这样一个机会,大家都知道webservice是基于soap的,而soap是XML的应用,如果你曾经...

我们在传统的web程序当中比较头疼的一件事是屏幕的刷新感。虽然有server push的技术,但在IE中较难实现。现在webservice给了我们这样一个机会,大家都知道webservice是基于soap的,而soap是XML的应用,如果你曾经用过ms XML sdk3.0的话就会知道里面有个XMLhttp方法,其实在那时我们就已经可以用XMLhttp的方式替代Form了,也是无刷新的,其实准确地说是局部刷新,下面我们来看一下怎样做,先做一个chat webservice, 首先来分析一下,一个聊天室应具备的两个要素人和消息,这样我们可以建立一个类型(记得我在以前说过类也是类型),它包含这样两个要素。

///ChatMessage.cs

using System;

namespace chat

{

///

/// ChatMessage类封装了两个string变量:UserLists--用户列表,Messages--要传递的信息

///

public class ChatMessage

{

public string UserList, Messages;

}

}

第二个我们要建立的是什么呢?一个聊天室应能存储在线成员的名字及访问时间

///Member.cs

using System;

namespace chat

{

///

/// Member类为每个聊天者封装了Server端的变量

///

public class Member

{

// 存储消息的队列

public string UserName, MsgQueue;

// 判断滞留事件以便踢人

public System.DateTime LastAccessTime;

// The constructor

public Member(string NickName)

{

this.UserName=NickName;

this.LastAccessTime=DateTime.Now;

}

}

}

接下来我们就应该做这个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 description for ChatWebService.

///

[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

///

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

///

private void InitializeComponent()

{

}

#endregion

///

/// Clean up any resources being used.

///

protected override void Dispose( bool disposing )

{

}

[WebMethod(Description="接收用户名作为参数存储到Application对象中")]

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方法用用户名和消息为参数返回一个ChatMessage对象,包括要传递的消息和用户列表")]

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("你当前可能没有登陆或登陆超时,请重新登陆!");

}

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

{

Member temp = (Member)Application[Members[x]];

temp.MsgQueue+=("
" + username + " 说:
" + 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为参数返回一个ChatMessage对象,包括要传递的消息和用户列表")]

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

{

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

{

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

{

Application.Remove((String)RemoveList[count]);

}

return;

}

}

}

责任编辑:admin
相关文章