操作系统实验报告
3
3
设计原理
计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还
是学习, 我们都越来越多的依靠到互联网。 各种实时性的聊天娱乐软件也同时诞生, 而且为
我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯 QQ、微软的 MSN 、移动的
Fetion 等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出
不穷,接下来的课程设计就是针对一个简单的网络聊天程序,利用 MFC 为开发工具,实现
基本的通讯功能。
此程序主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待
客户端发出请求, 登录到此服务端, 然后进行网络通讯和消息的转发; 客户端可通过服务器
端的 IP 地址发送连接请求,然后登陆聊天室。在服务器端的成员列表栏中会显示在线的所
有人名单, 有人退出聊天室, 成员列表会自动除名。 服务器端同时也提供了成员之间的私聊
功能,此时服务器端作为一个转发站,进行消息的转发。整个程序的主体使用了 CSocket
类的方法,实现了网络通讯聊天。
整个程序设计为两个部分:服务器 (ChatServer)和客户端 (Chat)
多人聊天的关键在于要将每个客户端发送过来的消息分发给所有其他客户端, 为了解决
这个问题, 在服务器程序中建立一个套接口链表, 用来保存所有与客户端建立了连接的服务
端口。下面描述了多人聊天的实现原理:
当客户端 Client N 向对应的服务端口 N 发送了消息 Message,服务端口 N 将 Message
复制给所有套接口列表 (USERLIST) 中的套接口缓冲区,然后向每个服务端口发送 WRITE
消息,使每个服务端口将 Message 发送给对应的客户端。这样,所有客户端就都获得了
Message 消息,实现了多人聊天功能。
BOOL CClientSocketList::Sends(char *buff,int n)
{CClientSocket *curr=Head;
while (curr)
{curr->Send(buff,n);
curr=curr->Next;}
return true;}
USERLIST 表时多人聊天程序的核心, 它是一个动态变化的链表, 为空表示没有客户端
建立了连接,不为空时每个元素就代表有一个客户端与服务器建立了连接。