65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# Web 服务创建聊天应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (35投票s)

2007 年 12 月 31 日

CPOL

5分钟阅读

viewsIcon

398579

downloadIcon

41899

这是一个使用Web服务用C#编写的很酷的聊天应用程序,具有所有功能。

引言

我们或多或少每天都在使用市面上许多可用的聊天应用程序,但有时仍然会想知道它是如何开发的。这是一个使用Web服务用DotNet开发的简单私人聊天应用程序。

该应用程序(我称之为 EasyTalk)主要面向仍然有时害怕使用Web服务的初学者。观众将体验如何轻松开发Web服务并在聊天应用程序中使用它。

背景

聊天客户端就像其他聊天应用程序一样使用Windows窗体开发,而聊天服务则使用位于Web服务器上的Dot Net Web服务开发。

Zip文件内容

上面附加的zip文件包含以下项目

1. Chat Service - 这是要部署在任何Web服务器上的Web服务。

2. Chat Client - 这是用户将用于聊天的聊天应用程序。

3. Chat Setup - 可分发安装包。

4. Chat Testing - 用于测试Web服务。

使用代码

ChatService.asmx (Web服务)

zip文件中的ChatService.asmx代表Web服务的名称,您将在其中看到许多Web方法,这些方法将被应用程序的客户端调用。

[WebService(Namespace = "%22%22http://tempuri.org/%22%22">http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ChatService : System.Web.Services.WebService
{
    static protected ArrayList arrUsers = new ArrayList();
    static protected ArrayList arrMessage = new ArrayList(); 
  
    public ChatService () { 
    
        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

请记住,这些方法始终是“public”的,否则它们将无法供外部世界访问。您只能将公共方法设置为Web方法,否则它们将被视为Web服务的私有方法。

让我们来了解其中的一些方法

[WebMethod]
public void AddUser(string strUser)
{ 
    arrUsers.Add(strUser); 
} 

AddUser()方法会将登录的用户添加到Web服务维护的ArrayList中。这样,在线用户列表始终是最新的,并且可以在任何时候提供房间里的用户列表。

[WebMethod]
public string GetUsers() 
{
    string strUser = string.Empty; 
    for (int i = 0; i < arrUsers.Count; i++)
    {
        strUser = strUser + arrUsers[i].ToString() + "|";
    }
    return strUser;
}

GetUser()方法将检索已登录应用程序的用户列表。此列表可以随时从ArrayList轻松获取。

[WebMethod]
public void RemoveUser(string strUser)
{
    for (int i = 0; i < arrUsers.Count; i++)
    {
        if(arrUsers[i].ToString() == strUser)
            arrUsers.RemoveAt(i);
    }
}

RemoveUser()方法则相反。当用户从应用程序注销时,它将从ArrayList中删除相应的名称。

[WebMethod]
public void SendMessage(string strFromUser, string strToUser, string strMess)
{
    arrMessage.Add(strToUser + ":" + strFromUser + ":" + strMess); 
}

SendMessage()方法将连接字符串(发送消息的用户名、发送消息的用户名和实际消息)作为参数,并将新字符串添加到另一个ArrayList中。这个ArrayList将简单地保存来自不同客户端发送给不同用户的消息。

[WebMethod]
public string ReceiveMessage(string strUser)
{
    string strMess = string.Empty;
    for (int i = 0; i < arrMessage.Count; i++)
    {
        string[] strTo = arrMessage[i].ToString().Split(':');
        if (strTo[0].ToString() == strUser)
        {
            for (int j = 1; j < strTo.Length; j++)
            {
                strMess = strMess + strTo[j] + ":";
            }
            arrMessage.RemoveAt(i);
            break;
        } 
    }
    return strMess;
}

ReceiveMessage()方法完成了所有工作。它将从ArrayList中过滤消息,并将每条消息发送给实际的接收者。

1. 它会逐一从ArrayList中取出消息。

2. 它会将消息中的“ToUser”名称与请求该方法的用户名进行比较。

3. 如果名称相同,则表示该消息仅发送给该接收者。它会将消息返回给用户,并在消息传输后从ArrayList中删除该消息。

ChatClient (客户端应用程序)

聊天用户列表窗口

聊天客户端使用Windows窗体开发。您会看到两个窗体,名为Form1用于显示在线用户列表,PrivateMessage用于聊天窗口。

在此解决方案中,我们将Web服务添加为该项目的Web引用。因此,每当您添加已部署在任何服务器上的Web服务时,客户端应用程序都会将该路径注册到服务器。

Form1是用于填充已登录EasyTalk应用程序的在线用户列表的界面。此应用程序没有登录窗体,因为用户名是从Windows登录名自动分配的。同一名称将显示在列表中,单击该名称将打开一对一的对话窗口与该人聊天。此窗体附加了一个计时器,该计时器每2秒调用Web服务中的GetUser() Web方法来更新在线用户列表。

chatlist.jpg

附加功能

1. 每当有用户登录应用程序时,所有在线用户的机器屏幕右下角都会弹出一个通知窗口,显示新在线用户的名称。[截图如下]

NotifyUser.JPG

2. 当用户最小化聊天窗口时,新消息将以弹出窗口的形式发送给该用户,就像上面的gtalk中的窗口一样,从屏幕右下角出现。

3. 如果用户不想在弹出窗口中接收消息,他可以选择主窗口底部的复选框“停止消息警报服务”。

聊天窗口

另一个窗体是privateMessage,它允许用户与其他人交谈。此窗体还附加了一个计时器,该计时器会调用ReceiveMessage()方法来检查是否有新消息到达。因此,如果一个用户打开了3个窗口,则相应的窗口将通过计时器查找自己的消息。

Private Message

在应用程序中,还使用了notifyIcon控件,以便用户可以将应用程序保持在系统托盘中运行。该应用程序关联了一个菜单,通过该菜单,

此应用程序中使用的一个醒目的功能是,每当收到新消息时,聊天窗口会闪烁。闪烁将一直持续到用户单击窗口读取消息为止。这是使用Windows API完成的。

[DllImport("user32.dll")]
static extern Int32 FlashWindowEx(ref FLASHWINFO pwfi);

配置窗口

有一个配置窗口用于更改服务器名称/IP地址。如果Web服务部署在不同的聊天服务器上,用户只需通过配置窗口将新的IP地址提供给应用程序。

关注点

这只是使用Web服务创建非常简单的聊天应用程序的一种方式。您可以使用不同的方法来创建此应用程序。您可以通过创建更多功能,如公共聊天、会议等,进一步改进此应用程序。

祝您聊天愉快!!!!!

历史

在此处保持您所做的任何更改或改进的实时更新。

© . All rights reserved.