网络编程课程设计简单的聊天室程序设计_第1页
网络编程课程设计简单的聊天室程序设计_第2页
网络编程课程设计简单的聊天室程序设计_第3页
网络编程课程设计简单的聊天室程序设计_第4页
网络编程课程设计简单的聊天室程序设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 网络与通讯程序设计班 级:03073学 号:030740303姓 名:乔治指导老师:贺刚 时 间:2010.06.06目 录摘要3一 设计内容.31、设计目的32、设计要求3二 设计原理3三 设计过程.41、程序设计流程及源代码.4(1)流程图.4(2)源代码.4i服务器4ii客户端.92、调试分析过程描述143、结果分析19结论.20参考文献.20一、设计内容1、设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以visual c+作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2、设计要求 采用客户/服务器模式,分为客户端程序和服务器

2、端程序。服务器采用winsock i/o模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑udp打洞直接建立端端连接)。二、设计原理服务器端通过socket()系统调用创建一个socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空socket,将客户端地址赋给这个socket。然后登录成功的客户就可以在服务器上聊天了。客户端程序相对简单,只需要建立一个so

3、cket与服务器端连接,成功后通过这个socket来发送和接收数据就可以了。socket聊天室基本原理是,抛开cgi(公共网关接口)和www服务器,根据html规范,接收到浏览器的请求以后,模仿www服务器的响应,将聊天内容发回浏览器。在浏览器看来就像浏览一个巨大的页面一样始终处于页面联接状态, 这就是一个专门的聊天服务器,一个简化了的www服务器。三、设计过程1、程序设计流程及源代码(1)流程图 (2)源代码 i服务器:/ serverdlg.cpp : implementation file/#include "stdafx.h"#include "serve

4、r.h"#include "serverdlg.h"#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ caboutdlg dialog used for app aboutclass caboutdlg : public cdialogpublic:caboutdlg();protected:declare_message_map();caboutdlg:caboutdlg() : cdialog(caboutdlg:idd)void c

5、aboutdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);begin_message_map(caboutdlg, cdialog)end_message_map()/ cserverdlg dialogcserverdlg:cserverdlg(cwnd* pparent /*=null*/): cdialog(cserverdlg:idd, pparent)m_hicon = afxgetapp()->loadicon(idi_iconapp);void cserverdlg:dodataexchan

6、ge(cdataexchange* pdx)cdialog:dodataexchange(pdx);ddx_control(pdx, idc_list_user, m_lbuser);ddx_text(pdx, idc_edit_display, m_strdisplay);begin_message_map(cserverdlg, cdialog)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_bn_start, onbnstart)on_bn_clicked(idc_bn_close, onbncl

7、ose)on_message(wm_receive, onreceive)on_message(wm_clientclose, onclientclose)on_message(wm_accept, onaccept)on_wm_destroy()end_message_map()/ cserverdlg message handlersbool cserverdlg:oninitdialog()cdialog:oninitdialog();assert(idm_aboutbox & 0xfff0) = idm_aboutbox);assert(idm_aboutbox < 0x

8、f000);cmenu* psysmenu = getsystemmenu(false);if (psysmenu != null)cstring straboutmenu;straboutmenu.loadstring(ids_aboutbox);if (!straboutmenu.isempty()psysmenu->appendmenu(mf_separator);psysmenu->appendmenu(mf_string, idm_aboutbox, straboutmenu);seticon(m_hicon, true);/ set big iconseticon(m_

9、hicon, false);/ set small iconm_inetport = 3127;m_server.initialize(this);m_bserver = false;getdlgitem(idc_bn_close)->enablewindow(false);return true; / return true unless you set the focus to a controlvoid cserverdlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)cabou

10、tdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);void cserverdlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.getsafehdc(), 0);int cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon)

11、;crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.height() - cyicon + 1) / 2;dc.drawicon(x, y, m_hicon);elsecdialog:onpaint();hcursor cserverdlg:onquerydragicon()return (hcursor) m_hicon;void cserverdlg:onbnstart() / 创建套接字m_server.create(m_inetport);/ 开始监听m_s

12、erver.listen();/ 显示cstring strinfo;strinfo.loadstring(ids_create_server);showindisplay(strinfo);m_bserver = true;getdlgitem(idc_bn_start)->enablewindow(false);getdlgitem(idc_bn_close)->enablewindow(true);void cserverdlg:onbnclose() closeserver();getdlgitem(idc_bn_start)->enablewindow(true);

13、getdlgitem(idc_bn_close)->enablewindow(false);void cserverdlg:onaccept()/ 创建新客户cmysocket *pnewclient = new cmysocket;pnewclient->initialize(this);m_server.accept(*pnewclient);/ 放入链表中m_lsclient.addtail(pnewclient);void cserverdlg:onclientclose(wparam wparam, lparam lparam)cmysocket *p_delclient

14、 = (cmysocket*)wparam;/ 关闭该用户p_delclient->shutdown();char bufferbuffersize;while(p_delclient->receive(buffer, buffersize)>0);p_delclient->close();/ 在用户链表中删除该用户position pscur, pslist = m_lsclient.getheadposition();cmysocket *p_curclient;while(pslist!=null)pscur = pslist;p_curclient = (cmy

15、socket *)m_lsclient.getnext(pslist);if(p_delclient=p_curclient)m_lsclient.removeat(pscur);break;/ 发送信息告诉其他用户该客户退出cstring strmsg;strmsg.loadstring(ids_client_close);netmessage netmessage(ptc_client_quit, p_delclient->getname(), _t(""), p_delclient->getname() + strmsg);sendtoallclient(

16、netmessage);/ 界面上清理该用户信息m_lbuser.deletestring(m_lbuser.findstring(-1, p_delclient->getname();showindisplay(p_delclient->getname() + strmsg);/ 删除该用户delete p_delclient;void cserverdlg:onreceive(wparam wparam, lparam lparam)cmysocket *p_curclient = (cmysocket*)wparam;netmessage netmessage;p_curcl

17、ient->receive(char *)&netmessage, sizeof(netmessage);switch(netmessage.type)case ptc_new:/ 新客户加入newclientadd(p_curclient, &netmessage);break;case ptc_say:/ 普通聊天showmessage(netmessage);break;/ 把加工过的信息发送给其他用户sendtoallclient(netmessage);void cserverdlg:closeserver()if(!m_bserver) return;/ 向所

18、有客户发送服务端关闭的信息cstring strinfo;strinfo.loadstring(ids_closeserver);netmessage netmessage(ptc_system, _t(""), _t(""), strinfo);sendtoallclient(netmessage);/ 服务端界面显示关闭信息showindisplay(strinfo);/ 关闭服务端m_server.close();/ 关闭客户端char bufferbuffersize;cmysocket *m_pclient;position pslist =

19、m_lsclient.getheadposition();while(pslist!=null)m_pclient = (cmysocket *)m_lsclient.getnext(pslist);m_pclient->shutdown();while(m_pclient->receive(buffer, buffersize)>0);m_pclient->close();delete m_pclient;m_lsclient.removeall();m_bserver = false;/ 向所有户发出信息void cserverdlg:sendtoallclient

20、(const netmessage &netmessage)cmysocket *m_pclient;position pslist = m_lsclient.getheadposition();while(pslist!=null)m_pclient = (cmysocket *)m_lsclient.getnext(pslist);m_pclient->sendmsg(netmessage);void cserverdlg:showindisplay(cstring str)m_strdisplay += str + "rn"updatedata(fals

21、e);void cserverdlg:ondestroy() cdialog:ondestroy();/ todo: add your message handler code here/ 新用户加入 void cserverdlg:newclientadd(cmysocket *p_client, netmessage *netmessage)/ 存入用户名字p_client->setname(netmessage->form);/ 在列表框中显示该用户m_lbuser.addstring(p_client->getname();/ 发送用户列表给该客户netmessage

22、 netmsg(ptc_user_list, _t(""), _t(""), _t("");int ilistlen = m_lbuser.getcount();cstring strmsg;for(int index=m_lbuser.gettopindex(); index<ilistlen; index+)m_lbuser.gettext(index, strmsg);strcpy(netmsg.data, (lpctstr)strmsg);p_client->sendmsg(netmsg);/ 加工信息strmsg

23、.loadstring(ids_new_client);strmsg = p_client->getname() + strmsg;strcpy(netmessage->data, (lpctstr)strmsg);/ 显示该用户进入showindisplay(strmsg);/ 显示普通消息void cserverdlg:showmessage(netmessage netmessage)cstring strto = netmessage.to;if(strto=_t("")strto = "所有人"cstring strform = n

24、etmessage.form;cstring strmsg = netmessage.data;cstring strout = strform + "对" + strto + "说:" + strmsg;showindisplay(strout);ii客户端:/ clientdlg.cpp : implementation file/#include "stdafx.h"#include "client.h"#include "clientdlg.h"#ifdef _debug#define

25、new debug_new#undef this_filestatic char this_file = _file_;#endif/ caboutdlg dialog used for app aboutclass caboutdlg : public cdialogpublic:caboutdlg();enum idd = idd_aboutbox ;protected:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv supportprotected:declare_message_map();caboutdlg:cab

26、outdlg() : cdialog(caboutdlg:idd)void caboutdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);begin_message_map(caboutdlg, cdialog)end_message_map()/ cclientdlg dialogcclientdlg:cclientdlg(cwnd* pparent /*=null*/): cdialog(cclientdlg:idd, pparent)m_strdisplay = _t("");m_str

27、send = _t("");m_bwhispering = false;m_hicon = afxgetapp()->loadicon(idr_mainframe);void cclientdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);ddx_control(pdx, idc_list_user, m_lbuser);ddx_text(pdx, idc_edit_diaplay, m_strdisplay);ddx_text(pdx, idc_edit_send, m_strsend

28、);ddx_check(pdx, idc_check_whispering, m_bwhispering);begin_message_map(cclientdlg, cdialog)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_bn_connect, onbnconnect)on_bn_clicked(idc_bn_close, onbnclose)on_bn_clicked(idc_bn_send, onbnsend)on_message(wm_receive, onreceive)on_mess

29、age(wm_socketclose, onserverclose)on_message(wm_send, onsend)on_message(wm_conncet, onconnect)on_lbn_dblclk(idc_list_user, ondblclklistuser)end_message_map()/ cclientdlg message handlersbool cclientdlg:oninitdialog()cdialog:oninitdialog();assert(idm_aboutbox & 0xfff0) = idm_aboutbox);assert(idm_

30、aboutbox < 0xf000);cmenu* psysmenu = getsystemmenu(false);if (psysmenu != null)cstring straboutmenu;straboutmenu.loadstring(ids_aboutbox);if (!straboutmenu.isempty()psysmenu->appendmenu(mf_separator);psysmenu->appendmenu(mf_string, idm_aboutbox, straboutmenu);seticon(m_hicon, true);/ set bi

31、g iconseticon(m_hicon, false);/ set small icon/ 参数初始化m_socket.initialize(this);m_strnetip = _t("");m_inetport = 3127;m_bconnect = false;getdlgitem(idc_bn_close)->enablewindow(false);getdlgitem(idc_bn_send)->enablewindow(false);return true; / return true unless you set the fo

32、cus to a controlvoid cclientdlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);void cclientdlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd,

33、 (wparam) dc.getsafehdc(), 0);int cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.height() - cyicon + 1) / 2;dc.drawicon(x, y, m_hicon);elsecdialog:onpaint();hcursor cclientdlg:onq

34、uerydragicon()return (hcursor) m_hicon;void cclientdlg:onbnconnect() cstring strconnecterror;/ 获取用户名字cinputdlg inputdlg;int iresult = inputdlg.domodal();if(iresult=idcancel)return;m_strname = inputdlg.m_strname;/ 创建套接字if(!m_socket.create()strconnecterror.loadstring(ids_fail_create_socket);showindisp

35、lay(strconnecterror);return;cstring strinfo;strinfo.loadstring(ids_connecting);showindisplay(strinfo);/ 连接服务器if(!m_socket.connect(m_strnetip, m_inetport)int n = m_socket.getlasterror();strconnecterror.loadstring(ids_fail_connect);showindisplay(strconnecterror);return;strinfo.loadstring(ids_succeed_c

36、onnect);showindisplay(strinfo);m_bconnect = true;/ 发送自已的名字netmessage netmessage(ptc_new, m_strname, _t(""), _t("");m_socket.sendmsg(netmessage);getdlgitem(idc_bn_connect)->enablewindow(false);getdlgitem(idc_bn_close)->enablewindow(true);getdlgitem(idc_bn_send)->enablewin

37、dow(true);void cclientdlg:onbnclose() if(m_bconnect) m_socket.close();m_bconnect = false;getdlgitem(idc_bn_connect)->enablewindow(true);getdlgitem(idc_bn_close)->enablewindow(false);getdlgitem(idc_bn_send)->enablewindow(false);m_lbuser.resetcontent();cstring strmsg;strmsg.loadstring(ids_bre

38、ak);showindisplay(strmsg);void cclientdlg:onbnsend() onsend();m_strsend = _t("");updatedata(false);void cclientdlg:onreceive()netmessage netmessage;m_socket.receive(char *)&netmessage, sizeof(netmessage);cstring strform = netmessage.form;/ 过滤自已发出的信息if(strform=m_strname) return;cstring

39、strto = netmessage.to;cstring strmsg = netmessage.data;switch(netmessage.type)case ptc_user_list:/ 用户列表m_lbuser.addstring(strmsg);break;case ptc_new:/ 新用户进入m_lbuser.addstring(strform);showindisplay(strmsg);break;case ptc_say:showmessage(netmessage);case ptc_whispering:/ 密语if(strto!=m_strname) return

40、;showmessage(netmessage);break;case ptc_client_quit:/ 有用户退出m_lbuser.deletestring(m_lbuser.findstring(-1, strform);showindisplay(strmsg);break;void cclientdlg:onserverclose()if(!m_bconnect) return;cstring strmsg;strmsg.loadstring(ids_server_close);showindisplay(strmsg);m_socket.close();m_bconnect = f

41、alse;getdlgitem(idc_bn_connect)->enablewindow(true);getdlgitem(idc_bn_close)->enablewindow(false);getdlgitem(idc_bn_send)->enablewindow(false);m_lbuser.resetcontent();void cclientdlg:onsend()updatedata(true);/ 主要是填充netmessage结构体netmessage netmessage;strcpy(netmessage.form, m_strname);strcpy

42、(netmessage.data, m_strsend);/ 取得列表框中的用户if(m_lbuser.gettext(m_lbuser.getcursel(), netmessage.to)=lb_err)strcpy(netmessage.to, _t("");if(m_bwhispering)/ 密语cstring strto = netmessage.to;if(strto=_t("") messagebox("请选择对方!", "错误");return;netmessage.type = ptc_whis

43、pering;elsestrcpy(netmessage.to, _t("所有人");netmessage.type = ptc_say;/ 发送该信息m_socket.sendmsg(netmessage);/ 显示发送信息cstring strto = netmessage.to;cstring strmsg = netmessage.data;showindisplay("你对" + strto + "说:" + strmsg);void cclientdlg:showindisplay(cstring str)m_strdisplay += str + "rn"updatedata(false);void cclientdlg:showmessage(const netmessage &netmessage)cstring strto = netmessage.to;if(strto=_t("")strto = &qu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论