C++课程设计:基于Socket通信的聊天室_第1页
C++课程设计:基于Socket通信的聊天室_第2页
C++课程设计:基于Socket通信的聊天室_第3页
C++课程设计:基于Socket通信的聊天室_第4页
C++课程设计:基于Socket通信的聊天室_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、.课 程 设 计 报 告 课程名称: 高级语言课程设计 设计题目: 基于Socket通信的聊天室 专 业:计算机科学与技术 姓 名: 学 号: 指导教师:李 晓 虹2016 年 1 月 10 日:1需求分析1.1聊天室程序的开发背景近年来,互连网发展日新月异,网络使空间的距离不再成为人们沟通的障碍,世界各个角落的人们可以通过Internet收发邮件、实时聊天、获取最新的资讯。因此本次毕业设计以“面向连接的Winsock网络会话程序开发”为题,制作一个C/S聊天室程序,通过制作该程序还能更好的学习网络socket编程的相关知识。 1.2聊天室的设计目标 本课题是建立聊天通信模型,设计一个聊天室软

2、件,只是简单的利用Socket来实现端到端的通信,主要功能为: 服务器端功能:1、初始化socket, 进行单对单的点对点连接模式2、输入远程用户的IP地址可以进行socket连接。3、接受用户传送来的聊天信息,然后显示在列表上。4、接受用户传送来的连接判断命令,并向用户发出响应命令。2.总体设计 2.1 功能要求² 支持点到点的连接,在服务器和多个客户端之间进行数据传输;² 接收客户端发送的消息,并显示在一个列表框中;² 显示出连接的用户计算机名字;2.2系统主要功能和主要功能描述:聊天程序必须能够做3件事情:(1) 聊天程序要在待定的端口上通过socket发送

3、聊天文字,并发送到开启相同程序的客户端。 (2) 聊天程序要及时接受从其他地方发送过来的信息,然后把这些信息显示在列表框中去。(3) 服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的,因此需要一个列表来记录。MFC的C

4、PtrList类就能实现这种功能。3.详细设计3.1设计流程图启动启动客户端用户创建子套接字MessageCClientSocketCClientSocketMessage登陆成功连接上发送message显示找到客户端并显示3.2设计实现(1)首先启动Visual C+ 6.0,利用MFC AppWizardEXE建立一个新的MFC工程,工程名为tcpclient,在MFC AppWizard Step1的时候选择Dialog based 即基于对话框,在Step4时勾选Windows Sockets选项(如图3-11),其他默认值下一步。图3-11(2)程序主要分为三个窗口,第一个是发送数据

5、的窗口,需要输入连接到服务器的相关设置信息,一般为IP地址,第二个是聊天信息显示窗口,也就是接受数据的窗口,该窗口显示接收到的消息;第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送,还有一个是主机名窗口,输入目标的主机名即可发送信息。图3-12 (3)下面重点介绍一下单击连接服务器按钮时的处理网络连接的函数。代码设置如下:BOOL CChatRoomDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF

6、000);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);/ Set the icon for this dialog. The framework do

7、es this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereInitSocket();return TRUE; / return TRUE unless you set the focus to a control(5)接下来就是创建通信隧道,绑定监听端口的函数,代码设置如下:

8、HCURSOR CChatRoomDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;BOOL CChatRoomDlg:InitSocket()m_socket = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);if(INVALID_SOCKET = m_socket)MessageBox("创建套接字失败");return FALSE;SOCKADDR_IN addrSock;addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSock.s

9、in_family = AF_INET;addrSock.sin_port = htons(6000);if(SOCKET_ERROR = bind(m_socket, (SOCKADDR *)&addrSock, sizeof(SOCKADDR)MessageBox("绑定失败");return FALSE;if(SOCKET_ERROR = WSAAsyncSelect(m_socket, m_hWnd, UM_SOCK, FD_READ)MessageBox("注册网络读取事件失败");return FALSE;return TRUE;通过

10、WSASocket()函数,来创建socket套接字建立通信隧道,再用htons来绑定本机的6000端口,即监听端口。(6)要显示客户端接收到来自其他用户的信息,代码设置如下:void CChatRoomDlg:OnSock(WPARAM wParam, LPARAM lParam)switch(LOWORD(lParam)case FD_READ:WSABUF wsabuf;wsabuf.buf = new char200;wsabuf.len = 200;DWORD dwRead;DWORD dwFlag = 0;SOCKADDR_IN addrFrom;int len = sizeof(

11、SOCKADDR);CString str,strTemp;HOSTENT *pHost;if(SOCKET_ERROR = WSARecvFrom(m_socket, &wsabuf, 1, &dwRead, &dwFlag, (SOCKADDR *)&addrFrom, &len, NULL, NULL)MessageBox("接收数据失败");return ;pHost = gethostbyaddr(char *)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);/str.Format

12、("%s说:%s", inet_ntoa(addrFrom.sin_addr), wsabuf.buf);str.Format("%s说:%s", pHost->h_name, wsabuf.buf);str += "rn"GetDlgItemText(IDC_EDIT_RECV, strTemp);str += strTemp;SetDlgItemText(IDC_EDIT_RECV,str);break;设计步骤: 接受来自服务器套接字的信息数据保存到addrFrom中,调整格式后将其打印到消息区。(7)当本地程序发送信息时

13、调用的功能函数。void CChatRoomDlg:OnBtnSend() / TODO: Add your control notification handler code hereDWORD dwIP;CString strSend;WSABUF wsabuf;DWORD dwSend;int len;CString strHostName;SOCKADDR_IN addrTo;HOSTENT *pHost;if(GetDlgItemText(IDC_EDIT_HOSTNAME, strHostName), strHostName = "")(CIPAddressCt

14、rl *)GetDlgItem(IDC_IPADDRESS1)->GetAddress(dwIP);addrTo.sin_addr.S_un.S_addr = htonl(dwIP);elsepHost = gethostbyname(strHostName);addrTo.sin_addr.S_un.S_addr = *(DWORD *)pHost->h_addr_list0);addrTo.sin_family = AF_INET;addrTo.sin_port = htons(6000);GetDlgItemText(IDC_EDIT_SEND, strSend);len =

15、 strSend.GetLength();wsabuf.buf = strSend.GetBuffer(len);wsabuf.len = len +1;SetDlgItemText(IDC_EDIT_SEND, "");if(SOCKET_ERROR = WSASendTo(m_socket, &wsabuf, 1, &dwSend, 0, (SOCKADDR *)&addrTo, sizeof(SOCKADDR), NULL, NULL)MessageBox("发送数据失败");return;4.系统调试在本地编译-组建-运行

16、后的结果,如图4-1所示:图4-1在远程一台客户端运行同样的程序,在两台客户端中填入对方的IP地址,如图4-2所示:图4-2在编辑框中填写发送的文字信息,如图4-3所示:图4-3发送后,如图4-4、图4-5所示:图4-4图4-5测试成功。5.结果分析通过点到点的连接建立了Socket连接,从而可以进行消息传输。6.总结通过一周的课程设计,让我学会了很多东西,也算能比较熟练地掌握MFC这一个软件了,动手能力增强了不少。源码:ChatRoom.cpp#include "stdafx.h"#include "ChatRoom.h"#include "

17、ChatRoomDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifBEGIN_MESSAGE_MAP(CChatRoomApp, CWinApp)ON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()/ CChatRoomApp constructionCChatRoomApp:CChatRoomApp()CChatRoomApp:CChatRoomApp()WSACleanup();/ The on

18、e and only CChatRoomApp objectCChatRoomApp theApp;/ CChatRoomApp initializationBOOL CChatRoomApp:InitInstance()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) /* Tell the user that we could not fi

19、nd a usable */* WinSock DLL. */return FALSE;if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) /* Tell the user that we could not find a usable */* WinSock DLL. */WSACleanup( );return FALSE; /* The WinSock DLL is acceptable. Proceed. */AfxEnableControlContainer();#ifdef _AFXDLL

20、Enable3dControls();#elseEnable3dControlsStatic();#endifCChatRoomDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)else if (nResponse = IDCANCEL)return FALSE;ChatRoomDlg.cpp#include "stdafx.h"#include "ChatRoom.h"#include "ChatRoomDlg.h"#if

21、def _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void Do

22、DataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/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);

23、/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CChatRoomDlg dialogCChatRoomDlg:CChatRoomDlg(CWnd* pParent /*=NULL*/): CDialog(CChatRoomDlg:IDD, pParent)/AFX_DATA_INIT(CChatRoomDlg)/ NOTE: the ClassW

24、izard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_socket = 0;CChatRoomDlg:CChatRoomDlg()if(m_socket)closesocket(m_socket);void CChatRoomDlg:DoDataExchange(CDataExchange* pD

25、X)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CChatRoomDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CChatRoomDlg, CDialog)/AFX_MSG_MAP(CChatRoomDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)/AFX_MSG_MAPON_MESS

26、AGE(UM_SOCK, OnSock)END_MESSAGE_MAP()/ CChatRoomDlg message handlersBOOL CChatRoomDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.

27、LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);/ TODO: Add extra initialization hereInitSocket();return TRUE; void CChatRoomDlg:OnSysCommand(UINT n

28、ID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CChatRoomDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in cl

29、ient 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 CChatRoomDlg:On

30、QueryDragIcon()return (HCURSOR) m_hIcon;BOOL CChatRoomDlg:InitSocket()m_socket = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);if(INVALID_SOCKET = m_socket)MessageBox("创建套接字失败");return FALSE;SOCKADDR_IN addrSock;addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSock.sin_family = AF_INET;add

31、rSock.sin_port = htons(6000);if(SOCKET_ERROR = bind(m_socket, (SOCKADDR *)&addrSock, sizeof(SOCKADDR)MessageBox("绑定失败");return FALSE;if(SOCKET_ERROR = WSAAsyncSelect(m_socket, m_hWnd, UM_SOCK, FD_READ)MessageBox("注册网络读取事件失败");return FALSE;return TRUE;void CChatRoomDlg:OnSock(

32、WPARAM wParam, LPARAM lParam)switch(LOWORD(lParam)case FD_READ:WSABUF wsabuf;wsabuf.buf = new char200;wsabuf.len = 200;DWORD dwRead;DWORD dwFlag = 0;SOCKADDR_IN addrFrom;int len = sizeof(SOCKADDR);CString str,strTemp;HOSTENT *pHost;if(SOCKET_ERROR = WSARecvFrom(m_socket, &wsabuf, 1, &dwRead, &dwFlag, (SOCKADDR *)&addrFrom, &len, NULL, NULL)MessageBox("接收数据失败");return ;pHost = gethostbyaddr(char *)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);/str.Format("%s说:%s", ine

温馨提示

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

评论

0/150

提交评论