《基于TCPIP的网络文字聊天程序设计(共24页).doc》由会员分享,可在线阅读,更多相关《基于TCPIP的网络文字聊天程序设计(共24页).doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 网络编程课程设计 题 目基于TCP/IP的网络文字聊天程序设计系 、 部: 计信学院 学生姓名: 学 号: 专 业: 网络工程 班 级: 网络1102班 指导教师: 王新祥 完成时间: 2013-12-18 前言 Socket协议:socket的英文原义是“孔”或“插座”。在这里作为4BDS UNIX的进程通信机制,取后一种意思。socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话
2、机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的
3、技术细节对他都是透明的,这也与socket机制非常相似。socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。至此,我们对socket进行了直观的描述。抽象出来,socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间网内部,每一个socket用一个半相关描述:(协议,本地地址,本地端口)一个完整的socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket 是面向客户/服务器模型而设计的
4、,针对客户和服务器程序提供不同的socket 系统调用。客户随机申请一个socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。目录一、课程设计任务书(一)设计题目 基于TCP/IP的网络文字聊天程序设计(二)设计要求1、对设计方法的要求使用Visual C+ 6.0开发出在Windows控制台或图形界面下运行的程序。2、对设计内容的要求实现网络文字聊天程序的服务器端。实现网络文字聊天程序的客户端。主程序的结构和
5、流程。程序运行过程的截图。网络文字聊天程序的实现原理。 网络文字聊天程序实现代码的分析。3、对课程设计说明书的要求 设计思路与开发过程。 对主要代码段要有较详细的注释。 对本次设计的评价、设计的收获与建议。4、说明书为打印件(三)设计完成后要上交的材料1、将说明书和源程序文件与可执行文件,一并存入光盘并上交(以班为单位,每个学生一个文件夹,文件夹名为“学号_姓名”,这个目录下存放工程文件夹与说明书的Word 2003文档)。2、设计说明书一份(必须用A4纸打印,不得少于20页)。 二、课程设计内容(一)设计功能:实现网络文字聊天程序的基本功能。主要包括:1TCP聊天服务器程序2TCP聊天客户端
6、程序3TCP聊天室程序(二)程序设计流程图1、功能模块图TCP网络聊天服务器程序 功能模块TCP网络聊天客户端程序TCP网络聊天室程序2、TCP网络聊天服务器流程图TCP聊天服务器程序 建立服务器判断地址创建失败服务器创建成功退出3、TCP网络聊天客户端流程图TCP聊天客户端程序 连接服务器判断连接连接失败连接成功退出4、网络聊天室程序网网络聊天室聊天室服务器地址聊天频道客户名称编辑发送信息已发送信息聊天室信息 (三)程序设计原理 聊天室原理:1、客户选择聊天的对象,将信息发送给服务器,然后服务器对这个信息进行判断,找到对应的套接字发送,而不发给其他用户。2、客户选择聊天的对象,将信息发送给服
7、务器,服务器不管这个消息,只认为是普通的信息,逐次发给每一个用户,有客户程序来判断,如果是自己的消息就显示出来;如果不是,则不加理睬。3、类似QQ那样的,当客户要求跟某人说话的时候,重新开启一个客户模式,实现点对点的通信。4、进入服务器界面和客户端,表明服务器和客户端连接正常。如果服务器地址或者端口号码输入错误,将不能连接到服务器,系统显示不能连接并且询问是否重新登陆。此时须重新设定以上两项内容然后登陆。这个程序中对发送的信息判断比较多,信息的格式定义也比较多。虽然不难,都是一些字符串的操作,但是比较复杂。(四)程序主要代码TCP聊天客户端程序代码:#include stdafx.h#incl
8、ude CSocketcli.h#include CSocketcliDlg.h#include #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifclass CAboutDlg : public CDialog public:CAboutDlg(); /AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExcha
9、nge(CDataExchange* pDX); /AFX_VIRTUAL / Implementation protected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) /AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDl
10、g)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()CCSocketcliDlg:CCSocketcliDlg(CWnd* pParent /*=NULL*/): CDialog(CCSocketcliDlg:IDD, pParent) /AFX_DATA_INIT(CCSocketcliDlg)/AFX_DATA_INITm_hIcon = AfxGetApp()-LoadIcon(IDR_MAI
11、NFRAME);void CCSocketcliDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CCSocketcliDlg)DDX_Control(pDX, IDC_BUTTON3, m_disconnect);DDX_Control(pDX, IDC_BUTTON2, m_connect);DDX_Control(pDX, IDC_EDIT2, m_edit2);DDX_Control(pDX, IDC_LIST1, m_list);DDX_Control(pDX, IDC_BU
12、TTON1, m_button1);DDX_Control(pDX, IDC_EDIT1, m_edit);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CCSocketcliDlg, CDialog)/AFX_MSG_MAP(CCSocketcliDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON3, OnDisconne
13、ct)/AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CCSocketcliDlg:OnInitDialog() CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE)
14、;/ Set small iconm_edit.SetLimitText(99);m_list.InsertColumn(0,消息);m_list.SetColumnWidth(0,435);m_button1.EnableWindow(FALSE);m_disconnect.EnableWindow(FALSE);m_edit2.SetWindowText(192.168.0.3);count=0;return TRUE; / return TRUE unless you set the focus to a controlvoid CCSocketcliDlg:OnSysCommand(U
15、INT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CCSocketcliDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in
16、 client rectangleint 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;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CCSocketcliDlg:O
17、nQueryDragIcon()return (HCURSOR) m_hIcon;void CCSocketcliDlg:OnOK() /CDialog:OnOK();/发送信息void CCSocketcliDlg:OnButton1() char buff100;CSize size;size.cx=0;size.cy=30;/获得发送信息m_edit.GetWindowText(buff,99);m_edit.SetWindowText();m_list.InsertItem(count+,buff);m_list.Scroll(size);/发送数据send(clisock,buff,
18、100,0);/线程UINT thread(LPVOID v)char buff100;char array2530=155.245.160.151, 155.245.160.152, 155.245.160.153, 155.245.160.154, 155.245.160.155, 155.245.160.156, 155.245.160.157, 155.245.160.158, 155.245.160.159, 155.245.160.160, 155.245.160.161, 155.245.160.162, 155.245.160.163, 155.245.160.164, 155
19、.245.160.165, 155.245.160.166, 155.245.160.167, 155.245.160.168, 155.245.160.169, 155.245.160.170, 155.245.160.171, 155.245.160.172, 155.245.160.173, 155.245.160.174, 155.245.160.175;CSize size;size.cx=0;size.cy=30;int s=1,addcount=0;CCSocketcliDlg *dlg=(CCSocketcliDlg*) AfxGetApp()-GetMainWnd();dlg
20、-m_connect.EnableWindow(FALSE);dlg-m_disconnect.EnableWindow(TRUE);/连接到服务器while(connect(dlg-clisock,(sockaddr*)&(dlg-cli),sizeof(dlg-cli) & dlg-ee!=0)dlg-m_edit.SetWindowText(等待.);/空循环for (int i=0;i=65000;i+)for(int j=0;jcli.sin_addr.s_addr=inet_addr(arrayaddcount+);if (dlg-ee=1)dlg-m_list.InsertIte
21、m(dlg-count+,连接成功);dlg-m_button1.EnableWindow(TRUE); dlg-SetForegroundWindow();/循环获得数据while(s!=SOCKET_ERROR & dlg-ee!=0)/调用recv函数接收数据s=recv(dlg-clisock,buff,100,0); dlg-SetForegroundWindow();if (s!=SOCKET_ERROR & dlg-ee!=0)dlg-m_list.InsertItem(dlg-count+,buff);dlg-m_list.Scroll(size);/发送断开命令send(dl
22、g-clisock,Disconnected,100,0);dlg-m_button1.EnableWindow(FALSE);dlg-m_connect.EnableWindow(TRUE);dlg-m_disconnect.EnableWindow(FALSE);closesocket(dlg-clisock);AfxEndThread(0);return 0;CCSocketcliDlg:CCSocketcliDlg()send(clisock,Disconnected,100,0);/连接服务器void CCSocketcliDlg:OnButton2() char ipaddress
23、35;m_edit2.GetWindowText(ipaddress,30);cli.sin_addr.s_addr=inet_addr(ipaddress);cli.sin_family=AF_INET;cli.sin_port=5000;/htons(5000);/创建socketclisock=socket(AF_INET,SOCK_STREAM,0);ee=1;/启动线程AfxBeginThread(thread,0);void CCSocketcliDlg:OnDisconnect() ee=0;closesocket(clisock);TCP聊天服务器程序主要代码:#include
24、 stdafx.h#include CSocket.h#include CSocketDlg.h#include #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifclass CAboutDlg : public CDialog public: CAboutDlg(); protected: DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataEx
25、change(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CCSocketDlg:CCSocketDlg(CWnd* pParent): CDialog(CCSocketDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); void CCSocketDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchang
26、e(pDX);/AFX_DATA_MAP(CCSocketDlg)DDX_Control(pDX, IDC_BUTTON1, m_button);DDX_Control(pDX, IDC_LIST1, m_list);DDX_Control(pDX, IDC_EDIT1, m_edit);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CCSocketDlg, CDialog)/AFX_MSG_MAP(CCSocketDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1,
27、 OnButton1)/AFX_MSG_MAPEND_MESSAGE_MAP()/初始化对话框BOOL CCSocketDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hI
28、con, FALSE);/ Set small iconcount=0;m_list.InsertColumn(0,消息);m_list.SetColumnWidth(0,435);m_edit.SetLimitText(99);for (int i=0;iGetMainWnd();/获得客户端数量msgcount=dlg-getcount();if (msgcount=-1)loop=0;if(loop)s=1;dlg-msgsockmsgcount=accept(dlg-sock,(sockaddr*)&(dlg-serv),&(dlg-addlen);if (dlg-msgsockmsg
29、count=INVALID_SOCKET)dlg-m_edit.SetWindowText(Error accept);else/启动线程AfxBeginThread(thread,0);dlg-SetForegroundWindow();dlg-m_list.InsertItem(dlg-count+,连接成功);dlg-m_list.InsertItem(dlg-count+,inet_ntoa(dlg-serv.sin_addr);dlg-m_list.Scroll(size);dlg-m_button.EnableWindow(TRUE);while(s!=SOCKET_ERROR)/
30、循环接收数据s=recv(dlg-msgsockmsgcount,buff,100,0);dlg-SetForegroundWindow();if (s!=SOCKET_ERROR)dlg-m_list.InsertItem(dlg-count+,buff);dlg-m_list.Scroll(size);dlg-sendtoall(dlg-msgsockmsgcount,buff);send(dlg-msgsockmsgcount,Disconnected,100,0);dlg-m_list.InsertItem(dlg-count+,Disconnected);dlg-m_list.Scr
31、oll(size);dlg-msgsockmsgcount=NULL;for (int i=0;imsgsocki!=NULL)flag=1;if (flag!=1)dlg-m_button.EnableWindow(FALSE);closesocket(dlg-msgsockmsgcount);/终止线程AfxEndThread(0);return 0;/发送数据void CCSocketDlg:OnButton1() char buff100;m_edit.GetWindowText(buff,99);m_edit.SetWindowText();m_list.InsertItem(cou
32、nt+,buff);CSize size;size.cx=0;size.cy=30;m_list.Scroll(size);/循环向所有客户发送信息for (int i=0;i50;i+)if (msgsocki!=NULL)send(msgsocki,buff,100,0);CCSocketDlg:CCSocketDlg() for (int i=0;i50;i+) if (msgsocki!=NULL) send(msgsocki,Disconnected,100,0);/获得还没有使用的socket数组号int CCSocketDlg:getcount() for (int i=0;i5
33、0;i+)if (msgsocki=NULL)return i;return -1;/向所有客户发送数据void CCSocketDlg:sendtoall(SOCKET s,char *buff) for (int i=0;i50;i+)if (msgsocki!=NULL & msgsocki!=s)/发送send(msgsocki,buff,100,0); (五)程序功能截图1、主截面截图 2、服务器端界面截图: 3、客户端界面截图: 三、课程设计心得与体会 一个星期的网络编程课程设计到今天为止完满结束。我们都有相应的磨练与收获。 通过本次网络编程的TCPIP网络聊天室设计,我学会了程序
34、设计与实现的一般方法,了解了C+技术的网络应用,领悟到用C+实现动态更新的方法要领,同时也是对所学内容的一个综合复习。不过,在系统的开发过程中,确实遇到了不少问题,特别是在程序的调试中。刚开始,由于对一些代码的不熟悉就是一个小小的错误也花了不少的时间和精力,时常要翻翻C语言程序的课本,看看用到的知识点,一点一滴的了解掌握,敲代码的时候虽然错误每次都是一大版,但一个个改了之后,程序能够运行就会油然而生一种成就感,当然有的错误自己都不知道错在哪,特别是在连接的时候,每次都快崩溃了,不断地查阅信息资料,在网上搜索相关素材,同时也请教培训的同学,才把它搞好,我坚信C语言是一切计算机专业的基础。随着对一些相关知识的不断学习,慢慢也了解了网络编程的过程,后来也慢慢就缩短了课程设计所用的时间,在整个网络聊天室设计和完成的过程中,我觉得,功夫是不会不负有心人的,最后终于成功地完成了此次课程设计的所有要求,同时除了上面具体说的那些我还拓宽了自己的眼界,将书上的理论与实践有效的结合转换我自己的知识,也有了一点点的设计经验,又学到了不少的知识,我相信以后不论是在工作中还是学习中对我都有很大的帮助。 最后我想说,感谢老师这一学期的辛苦授课,祝老师身体健康! 四、参考文献1 网络编程技术2 谭浩强. C程序设计(第四版). 清华大学出版社,2010.06专心-专注-专业