基于TCP的网络
聊天室的设计
【基于TCP的网络聊天室的设计】-实验指导
∙一、实验目的
1.掌握通信规范的制定及实现。
2.练习较复杂的网络编程,能够把协议设计思想应用到现实应用中。
1.二、实验内容和要求
1.进一步熟悉VC++6编程环境;
2.利用VC++6进行较复杂的网络编程,完成网络聊天室的设计及编写;
三、实验(设计)仪器设备和材料
1.计算机及操作系统:PC机,Windows;
2.网络环境:可以访问互联网;
∙四、TCP/IP程序设计基础
基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两
部分。
设计思路(VC6.0下):
第一部分服务器端
一、创建服务器套接字(create)。
二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输(send/receive)。
五、关闭套接字(closesocket)。
第二部分客户端
一、创建客户套接字(create)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输(send/receive)。
四、关闭套接字(closesocket)。
CSocket的编程步骤:(注意我们一定要在创建MFC程序第二步的时候选上Windows Socket选项,其中ServerSocket是服务器端用到的,ClientSocket是客户端用的。
)???
(1)构造CSocket对象,如下例:
CSocket ServerSocket;
CSocket ClientSocket;
(2)CSocket对象的Create函数用来创建Windows Socket,Create()函数会自行调用Bind()函数
将此Socket绑定到指定的地址上面。
如下例:
ServerSocket.Create(823); //服务器端需要指定一个端口号,我们用823。
ClientSocket.Create(); //客户端不用指定端口号。
(3)现在已经创建完基本的Socket对象了,现在我们来启动它,对于服务器端,我们需要这个Socket 不停的监听是否有来自于网络上的连接请求,如下例:
ServerSocket.Listen(5);//参数5是表示我们的待处理Socket队列中最多能有几个Socket。
(4)对于客户端我们就要实行连接了,具体实现如下例:
ClientSocket.Connect(CString SerAddress,Unsinged int SerPort);//其中SerAddress是服务器
的IP地址,SerPort是端口号。
(5)服务器是怎么来接受这份连接的呢?它会进一步调用Accept(ReceiveSocket)来接收它,而此时服务器端还须建立一个新的CSocket对象,用它来和客户端进行交流。
如下例:
CSocket ReceiveSocket;
ServerSocket.Accept(ReceiveSocket);
(6)如果想在两个程序之间接收或发送信息,MFC也提供了相应的函数。
如下例:ServerSocket.Receive(String,Buffer); //String是你要发送的字符串,Buffer是发送字符串的缓冲区大小。
ServerSocket.Send(String,Butter);//String是你要接收的字符串,Buffer是接收字符串的
缓冲区大小。
框架实现:
客户端在MFC中创建对话框:
void CClientDlg::OnButtonReceive()
{
CString strAddr="202.112.73.150";
unsigned int nPort=5050;
if(!ChatReceive.Create())
{
MessageBox("create failed","Receive",MB_ICONSTOP);
return;
}
else
{
ChatReceive.Connect(strAddr,nPort);
}
char sReceive[1024];
strAddr.Format(sReceive);
ChatReceive.Receive(sReceive,1024,0);
m_strEdit=sReceive;
UpdateData(FALSE);
ChatReceive.Close();
}???
服务器端创建对话框:
void CServerDlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
CString strSendText;
unsigned int nPort=5050;
GetDlgItemText(IDC_EDIT,strSendText);
if(!ChatSend.Create(nPort))
MessageBox("create failed");
else
{
ChatSend.Listen();
ChatSend.Accept(server);
}
server.Send(strSendText,1000,0);
server.Close();
ChatSend.Close();
}??
五、基于TCP的网络聊天室的设计要求:?
(1)制定通信规范。
(2)设计界面如下:
1 服务器端
2 客户端
(3)设计思路:
①TCP/IP数据通信--- “聊天”消息传输格式
客户机-à服务器
(ⅰ)传输“用户名”
STX+1+用户名+ETX
(ⅱ)悄悄话
STX+2+用户名+”,”+内容+ETX
(ⅲ)对所有人说
STX+3+内容+ETX
? ?服务器-à客户机
(ⅰ)首次传输在线用户名
STX+1+用户名+ETX
(ⅱ)传输新到用户名
STX+2+用户名+ETX
(ⅲ)传输离线用户名
STX+3+用户名+ETX
(ⅳ)传输聊天数据
STX+4+内容+ETX
(注:STX为CHR(2),ETX 为CHR(3))
②服务器端
(ⅰ)定义一个动态数组存储连接用户。
定义一个全局变量存储连接用户的元素个数。
(ⅱ)用一个使用UDP协议的SOCKET套接字完成发送服务器IP地址。
在该控件的数据接收事件中发送服务器IP地址
(ⅲ)用一个使用TCP协议的SOCKET套接字数组完成TCP连接及数据发送和接收,处理它的连接请
求事件。
(ⅳ)SOCKET套接字的数据到达事件中首先接收数据到一个变量中,然后从这个变量中逐个提取消息,
并对每个消息判断消息类型及做相应处理:
case? 类型1??? ……传输“用户名”
修改用来存储连接用户的元素个数的数组
向所有在线用户发送该用户名消息
向该用户发送所有在线用户名的消息
case 类型2?? ……悄悄话
向源和目标用户发送消息
case 类型3?? ……对所有人说
向所有在线用户发送消息
(ⅴ)服务器端的断开连接事件中
修改存储连接用户的元素个数的数组,卸载此控件,向所有在线用户发送消息离线。
③客户端
(ⅰ)添加一个SOCKET套接字,窗体加载时使用UDP协议,发广播数据报;等待接收到服务器主机
地址后使用TCP协议完成连接及数据传送。
(ⅱ)在客户端的数据到达事件中接受数据,如果客户端协议使用的是UDP协议,关闭客户端连接,重新设置客户端的协议、远程端口号、本地端口等参数,再调用连接方法请求连接,输入用户名,连接成功时发送用户名消息。
否则,从接受的数据字符串中逐个提取消息,并对每个消息判断消息类型及做相应处
理:
case 类型1??? ……首次传输在线用户名
将用户名加入到用户列表中;
case 类型2??? ……首次传输在线用户名
将用户名加入到用户列表中;
在聊天内容中添加该用户名加盟;
case类型3??? ……传输离线用户名
从用户列表中删除该用户名
在聊天内容中添加该用户名退出;
case类型4??? ……传输聊天数据
在聊天内容中添加聊天数据;
(ⅲ)在命令按纽触发事件中发送聊天内容
根据用户列表中的当前用户决定消息类型,并发送聊天数据。
1.六、实验报告要求
提交一篇关于本设计的论文,字数不少于1000字,论文内容需包含如下几项内容。
一、系统概要
二、通信规范的制定
三、主要模块的设计分析
四、系统运行效果(要求有屏幕截图)
五、心得与体会
要求采用学校的实验报告书(16开),并提交设计的论文的电子版(用E-Mail发送到邮箱
genechen@)。