创建一个客户端-服务器应用程序 - 制作一个聊天






4.77/5 (9投票s)
制作一个典型的客户端-服务器聊天应用程序
引言
本文展示了如何创建一个典型的客户端/服务器应用程序,在本例中是一个聊天程序。

该项目分为两部分,两个解决方案。
一方面,我们有服务器解决方案。这是一个 Windows 服务项目。 如果我们要使用此应用程序,我们必须先安装它才能与其他服务一起运行在我们的计算机上。 为此,必须使用 installutil.exe 工具进行安装。
命令如下
installutil.exe [PATH]\svcChat.exe
如果我们要卸载该服务,我们必须使用以下命令
installutil.exe /u [PATH]\svcChat.exe
此服务的安装程序配置为手动启动。 如果您希望该服务自动启动,请更改其构造函数中的属性。 您可以对 Service Account 属性执行相同的操作。
另一方面,我们有一个简单的聊天应用程序,它被制作成 Windows Form 项目。
背景
有一些操作用于在服务器和客户端之间进行通信
- #NICK#
当客户端请求更改其昵称时使用此操作。 - #JOIN#
当客户端尝试加入聊天室时使用此操作。 - #MSG#
客户端和服务器使用此操作发送消息。 - #BYE#
客户端和服务器使用此操作来通知连接将关闭。 - #USERLIST#
服务器使用此操作来通知当前已连接的昵称的完整列表。 - #NOTNICKNAME#
服务器使用此操作来通知它试图更改的名称不可用。
Using the Code
这是有趣的部分。
服务器
服务器应用程序有两个主要类:Connection
和 ConHandler
。Connection
包含与客户端通信的所有属性和方法,而 ConHanlder
处理正在使用的所有连接。 您可以通过编辑配置文件来设置服务的端口号。
此外,还有一个名为 Logger
的类。 您可以通过配置文件对其进行配置,以便调试应用程序。 您只需设置服务应该写入其跟踪的所有内容的文件路径。
当服务启动时,它会抛出一个线程来监听新的连接请求。 建立新连接后,它将被放入连接集合中,并且线程会抛出一个委托,用于监听来自客户端的消息。
监听新连接
private void AcceptingSockets()
{
try
{
while (true)
{
Socket socket = this.tcpListener.AcceptSocket();
Connection con = new Connection(socket);
this.connections.Add(con);
ListenDelegate lDel = this.Recieve;
AsyncCallback lCallBack = new AsyncCallback(this.ListenCallBack);
lDel.BeginInvoke(con, ListenCallBack, null);
}
}
catch { }
}
从客户端接收数据
private void Recieve(Connection _con)
{
while (_con.IsConnected)
{
try
{
string msg = _con.ReadLine();
this.DataHandler(msg, ref _con);
if (this.log != null)
this.log.WriteLine(_con.NickName + ": " + msg);
}
catch (Exception ex)
{
if (this.log != null)
this.log.WriteLine("ERROR: " + ex.Message);
}
}
this.RemoveConnection(_con);
}
一旦从客户端接收到数据,它将由其对应的方法处理。
处理数据
private void DataHandler(string _data, ref Connection _con)
{
string[] array = _data.Split(' ');
if (array.Length > 0)
{
switch (array[0])
{
case "#NICK#":
case "#JOIN#":
string nickName = array[1];
if (!this.ExistsNickname(nickName))
{
this.AddOrChangeNick(nickName, ref _con);
this.SendUserListToEveryBody();
}
else
{
this.SendMessage("#NOTNICKNAME# " + nickName, _con);
}
break;
case "#MSG#":
this.SendMsgToEveryBody(_data, _con.NickName);
break;
case "#BYE#":
_con.Dispose();
this.RemoveConnection(_con);
this.SendUserListToEveryBody();
break;
}
}
}
客户端
这是一个简单的客户端应用程序。
主类是 Connection
。 它提供了建立与服务器的连接以及写入和接收数据所需的所有方法和属性。
通过连接的表单,我们可以与服务器建立连接,指示服务器的 IP 地址、服务器的端口号以及我们希望使用的昵称。
建立连接后,应用程序会抛出一个线程来监听来自服务器的所有消息,并由其对应的方法处理。
连接到服务器
public bool Connect()
{
try
{
this.tcpClient = new TcpClient(this.serverIp, this.portConnection);
if (this.tcpClient.Connected)
{
this.netStream = this.tcpClient.GetStream();
this.streamWriter = new System.IO.StreamWriter(this.netStream);
this.streamReader = new System.IO.StreamReader(this.netStream);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return this.IsConnected;
}
我们可用的另一个选项是使用昵称表单更改我们的昵称。

当然,如果您希望添加更多功能,您可以通过在服务器服务和客户端应用程序上添加新方法来修改该项目。