在客户端程序和服务器端有很多的相似。在服务器端维护的是一个可以连接所有客户端的程序,为客户端程序提供一个连接端口,接收客户端发送过来的消息,并且将消息转发给所有的客户端,以显示在每个客户端的界面上。同时也在服务器端的界面上显示。因而它需要创建(Create),监听(Listen),设置可接收端口(Accept),接收消息(Receive),发送消息(Send),维护一个消息队列,以及一个客户机队列,处理任何一个客户机的加入与退出。显得有写复杂。而相对客户机程序来说则显得要稍微简单一些,它只要在启动时,建立和服务器的连接,并且发送一个自己已经进入聊天室的消息,然后发送自己的消息,并且接收服务器发送过来的消息,在退出时发送退出聊天室的消息,做一些内存的清理工作,即可结束。
相同的,服务器和客户端的消息发送,接收消息的功能都是通过CSocket,CSocketFile,CArchive三个类共同来实现的。下面就来解读客户端程序。
同样的,客户端程序有自身的主框架窗口,用于主要的程序处理。辅助的类有CMsg类,用于消息的存储,表示。以及部分处理。CChatSocket类,用于同服务器建立连接。CSetupDialog类,用于启动时的端口以及服务器的设置。
首先在CClientDlg类的OnInitDialog中显示设置服务器以及连接端口的对话框,后创建套接字,和服务器建立连接。接收消息。在连接中传入自己的名字,服务器的名字,以及端
口号。在建立连接的函数中,先创建套接字类(Create),后连接(Connect)。在连接成功后创建CSocketFile类对象,并且创建CArchive类对象,两个,一个用于读取网络的消息,一个用于发送网络的消息。两个都要在构造函数中与CSocketFile类关联。在第一次进入和服务器连接成功后需要发送一个自己进入聊天室的消息。
在建立连接后,当服务器发来消息后需要响应并接收消息。因而调用OnReceive函数
处理接收到的消息直到消息“文件”不为空,对接收到的消息,先将其串行化。然后显示输出,知道处理完所有的消息。如果接收的服务器关闭的消息,则做内存清理的工作。
如果有消息需要发送,则调用OnSend函数响应Button点击的消息。如果发送的消息不为空,则调用SendMsg函数发送消息。
SendMsg函数先格式化消息,后串行化消息,并且将消息发送出去。
再后来就是一个做在程序退出时做的扫尾工作,
具体的代码在资源中