山东建筑大学课程设计Word格式文档下载.docx
- 文档编号:18437418
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:15
- 大小:143.41KB
山东建筑大学课程设计Word格式文档下载.docx
《山东建筑大学课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《山东建筑大学课程设计Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。
在网络早期就开始盛行,不论是BBS,IRC都有类似网上聊天室的机制。
聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。
聊天室适用于网上会议或闲聊的一些场合。
聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。
聊天室的设计目标
本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为:
服务器端功能:
1、初始化socket,创建服务器端。
2、维护一个链表,保存所有用户的IP地址、端口信息。
3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。
4、接受用户传送来的连接判断命令,并向用户发出响应命令。
客户端功能:
客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。
当按下“发送”按钮时将信息发送给服务器。
通过本课题的毕业设计,可以比较深入的了解和掌握WINSOCK控件基本属性、方法和事件,理解网络聊天通信的概念,输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。
并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。
2.相关知识
2.1Winsock介绍
WindowsSockets规范以U.C.Berkeley大学BSDUNIX中流行的Socket接口为范例定义了一套MicosoftWindows下网络编程接口。
它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;
也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
WindowsSockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。
此外,在一个特定版本Windows的基础上,WindowsSockets也定义了一个二进制接口(ABI),以此来保证应用WindowsSocketsAPI的应用程序能够在任何网络软件供应商的符合WindowsSockets协议的实现上工作。
因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。
2.2MFC类CAsyncsocket和CSocket
构造一个CAsyncSocket对象并使用该对象创建基础SOCKET句柄。
套接字的创建遵循两阶段构造的MFC模式。
例如:
CAsyncSocketsock;
sock.Create();
//Usethedefaultparameters
对于服务器套接字,必须指定端口。
对于客户端套接字,通常接受此参数的默认值,该值允许WindowsSockets选择端口。
套接字类型:
SOCK_STREAM(默认值)或SOCK_DGRAM。
套接字“地址”,如“”或“128.56.22.8”。
该地址为网络上的网际协议(IP)地址。
很可能要始终依赖此参数的默认值。
如果套接字是客户端,则使用CAsyncSocket:
:
Connect将此套接字对象连接到服务器套接字。
销毁CAsyncSocket对象。
如果在堆栈上创建了套接字对象,当包含函数超出范围时将调用此对象的析构函数。
如果使用new运算符在堆上创建了套接字对象,则必须负责使用delete运算符销毁此对象。
“阻塞”方案。
发送和接收计算机之间的字节顺序差异。
在Unicode和多字节字符集(MBCS)字符串之间转换。
2.3利用CSocket进行有连接的通信
CAsyncSocket类逐个封装了WinSockAPI,为高级网络程序员提供了更加有力而灵活的方法。
这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS间转换字符的任务。
为了提供更方便的接口以自动处理这些任务,MFC给出了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSockAPI接口。
Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。
CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。
阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo()和Accept())直到操作完成后才返回控制权。
3.1客户端的实现
(1)首先启动VisualC++6.0,利用MFCAppWizard[EXE]建立一个新的MFC工程,工程名为tcpclient,在MFCAppWizardStep1的时候选择Dialogbased即基于对话框,在Step4时勾选WindowsSockets选项(如图3.11),其他默认值下一步。
图3.11MFC的设置
(2)客户端主要分为三个窗口,第一个是连接窗口,需要输入连接到服务器的相关设置信息;
第二个是聊天信息显示窗口,该窗口显示登录服务器以来发送和接收到的消息;
第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送。
(单击连接服务器按钮时的处理网络连接的函数。
代码设置如下:
voidCTcpclientDlg:
Onconnet()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(clconect)clconect.Close();
CStringipstr,portstr;
intport;
GetDlgItemText(IDC_EDIT1,ipstr);
GetDlgItemText(IDC_EDIT2,portstr);
GetDlgItemText(IDC_EDIT5,clientname);
portstr.TrimLeft();
portstr.TrimRight();
port=atoi(portstr);
if(port>
0&
&
port<
9999){
clconect.Create();
//cslisten.Bind(port);
if(clconect.Connect(ipstr,port))
{
clconect.setp(this);
CWnd*cw=GetDlgItem(IDC_EDIT1);
cw->
EnableWindow(false);
cw=GetDlgItem(IDC_EDIT2);
cw=GetDlgItem(IDC_connet);
cw=GetDlgItem(IDC_EDIT5);
SetDlgItemText(IDC_EDIT3,"
已设名字"
+clientname+"
\r\n连接服务器成功"
);
CStringenterinfo=clientname+"
进入聊天室"
;
intlen=enterinfo.GetLength();
clconect.Send(enterinfo,len);
}
else{
clconect.Close();
MessageBox("
连接失败,请检查IP与端口是否与服务器一致!
或者服务器没打开"
"
连接错误"
MB_ICONERROR);
}
else{
MessageBox("
端口或IP输入有误,请重新输入"
}
设计步骤:
①创建字符串ipstr(保存IP),portstr(保存端口),clientname(用户名),整型port(端口号)。
②利用GetDlgItemText将各个编辑框中的信息赋给相应的变量。
③监视端口号和IP格式并设置相应错误提示(如下图)。
图3.13连接错误提示
图3.14端口或IP错误提示
④创建套接字clconect,设置成功创建后相关控件为只读。
⑤设置建立连接后相应提示。
(5)接下来就是对话框中的发送(回车)按钮的函数,代码设置如下:
Onsend()
CStringstr;
GetDlgItemText(IDC_EDIT4,str);
str=clientname+"
"
+str;
intlen=str.GetLength();
if(clconect.Send(str,len)>
1)SetDlgItemText(IDC_EDIT4,"
定义字符串str用于保存输入的消息,调整格式后使用CSocket的操作函数send将消息发送到服务器。
(6)要显示客户端接收到来自服务器其他用户的信息,代码设置如下:
onrev()
CStringstr,str1;
charss[256];
for(intj=0;
j<
256;
j++)ss[j]='
\0'
clconect.Receive(ss,256);
if(ss!
="
)
str.Format("
%s"
ss);
GetDlgItemText(IDC_EDIT3,str1);
str=str1+"
\r\n"
SetDlgItemText(IDC_EDIT3,str);
CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT3));
ce->
LineScroll(ce->
GetLineCount()-1);
①创建字符串str、str1,字符数组ss。
②接受来自服务器套接字的信息数据保存到ss中,调整格式后将其打印到消息区。
(7)当与服务器断开连接时弹出警告,如下图:
图3.15失去连接提示
oncl()
MessageBox("
失去连接或者找不到服务器"
CWnd*cw=GetDlgItem(IDC_EDIT1);
cw->
EnableWindow(true);
cw=GetDlgItem(IDC_EDIT2);
cw=GetDlgItem(IDC_connet);
cw=GetDlgItem(IDC_EDIT5);
当失去与服务器的连接后,重新将连接服务器设置编辑框启用等待下次连接。
(8)在退出程序时的提示,如下图:
图3.16退出确认
OnClose()
intconfirm=MessageBox("
确定退出吗"
请确定"
MB_YESNO|MB_ICONQUESTION);
if(confirm==IDYES){
CStringenterinfo=clientname+"
退出了聊天室"
intlen=enterinfo.GetLength();
clconect.Send(enterinfo,len);
CDialog:
OnClose();
①当退出程序时,弹出确认对话框。
②当选择“是”时,将用户退出信息发送至服务器并关闭对话框。
至此客户端的核心部分介绍完毕。
3.2服务端的实现
(1)和客户端一样,仍然建立一个基于对话框的工程,工程名为tcpserver,同样,注意一定不要忘记在Step4时勾选WindowsSockets选项。
其他默认下一步。
(2)客户端主要分为三个窗口,第一个是服务器信息设置窗口,需要输入服务器的相关设置信息;
第二个是聊天信息显示窗口,该窗口显示启动服务器以来发送和接收到的消息;
新建一个对话框,并添加各种控件(见控件表3.2)如下图:
单击启动服务器按钮时的处理网络连接的函数。
voidCTcpseverDlg:
Onlisten()
//Beep(2000,100);
intport;
GetDlgItemText(IDC_EDIT3,ipstr);
severname=ipstr;
GetDlgItemText(IDC_EDIT4,portstr);
if(cslisten.Create(port)){
//cslisten.Bind(port);
cslisten.Listen();
cslisten.setp(this,csnum);
CWnd*cw=GetDlgItem(IDC_EDIT3);
cw=GetDlgItem(IDC_EDIT4);
cw=GetDlgItem(IDC_listen);
cw=GetDlgItem(IDC_EDIT1);
SetWindowText("
服务器名:
+severname+"
\r\n等待用户连接,监听端口:
+portstr+"
..."
设置监听端口失败,端口可能被其它程序占用"
cslisten.Close();
端口输入有误,请重新输入"
}
①创建字符串ipstr(保存IP),portstr(保存端口),整型port(端口号)。
③监视端口号和IP格式并设置相应错误提示
④设置建立连接后相应提示。
CStringstr,history;
GetDlgItemText(IDC_EDIT1,history);
GetDlgItemText(IDC_EDIT2,str);
str=severname+"
intsended;
for(inti=1;
i<
=csnum;
i++)if(csrev[i])
if(sended=csrev[i].Send(str,len)){
SetDlgItemText(IDC_EDIT2,"
SetDlgItemText(IDC_EDIT1,history+"
+str);
CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT1));
ce->
定义字符串str用于保存输入的消息,调整格式后使用CSocket的操作函数send将消息发送到各个客户端。
(6)要显示服务器接收到来自客户端其他用户的信息,代码设置如下:
onrev(intmynum)
inti;
charss[100];
100;
csrev[mynum].Receive(ss,100);
str.Format("
for(i=1;
i++)if(csrev[i])
if(csrev[i])csrev[i].Send(str,100);
GetDlgItemText(IDC_EDIT1,str1);
str=str1+"
SetDlgItemText(IDC_EDIT1,str);
CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT1));
ce->
(7)当有新用户进入时,显示“XXX进入”。
代码如下:
onac()
CStringstr1,str;
GetDlgItemText(IDC_EDIT1,str1);
CStringstr2="
\r\n进入"
str=str1+str2;
SetDlgItemText(IDC_EDIT1,str);
cslisten.Accept(csrev[++csnum]);
csrev[csnum].setp(this,csnum);
图3.24退出确认
CStringstr="
服务器即将退出"
intconfirm=MessageBox("
确定退出服务器?
所有用户都将断开"
intlen=str.GetLength();
for(inti=1;
i++)if(csrev[i])csrev[i].Send(str,len);
str=severname+"
退出,与服务器连接已断开"
len=str.GetLength();
for(i=1;
②当选择“是”时,将服务器关闭信息发送至各个客户端并关闭对话框。
.程序运行结果
4.1服务器端
总结与致谢
这次课程设计基本上涵盖了老师上课讲的VC++知识点,课程设计题目不仅要求对课本知识有较深刻的了解,同时要求同学有较强的思维能力。
首先要理清思路,弄懂到底要解决什么问题及相应的步骤,采取的方法,以及对一些可能的程序异常或是常见问题的容错检测和修正方案等。
同时了解到课程设计,不仅是理论上的概念,还有能力方面的锻炼,锻炼的不仅是动手能力,还有我们头脑的严谨、思索能力,以及专注的精神。
最后,需要感谢的是我们的指导老师张明玉,是她的耐心指引让我们眼前一亮,引领我们看到知识的奇妙,开拓我们的视野;
是她的平易近人与亲切让我们更懂得如何团结互助;
是她的谆谆教导带给我们积极探索的追求。
参考文献
(1)孙鑫余安萍.VC++深入详解.电子工业出版社.2006
(2)郑阿奇.VisualC++实用教程(第2版).电子工业出版社.2003
(3)刘瑞吴跃进王宗越.VisualC++项目开发实用案例.科学出版社.2006
(4)刘瑞吴跃进王宗越.VisualC++项目开发实用案例.科学出版社.2006
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 建筑 大学 课程设计