1、网络编程课程设计说明书网络编程课程设计说明书基于TCP/IP的网络文字聊天程序设计专业: 网络工程 班级: 1402班 * * 学号: 1*3 时间: 2016年12月26日 一、课程设计任务书(一)设计题目基于TCP/IP的网络文字聊天程序设计。(二)设计要求1、开发平台:Visual C+ 6.02、对设计方法的要求使用Visual C+ 6.0开发出在Windows控制台或图形界面下运行的程序。3、对设计内容的要求1实现网络文字聊天程序的服务器端。2实现网络文字聊天程序的客户端。3主程序的结构和流程。4程序运行过程的截图。5网络文字聊天程序的实现原理。 6网络文字聊天程序实现代码的分析。
2、4、对课程设计说明书的要求 设计思路与开发过程。 对主要代码段要有较详细的注释。 对本次设计的评价、设计的收获与建议。5、说明书为打印件(三)设计内容实现网络文字聊天程序的基本功能。(四)设计时间1周。(五)设计完成后要上交的材料1、将说明书和源程序文件与可执行文件,一并存入光盘并上交(以班为单位,每个学生一个文件夹,文件夹名为“学号_姓名”,这个目录下存放工程文件夹与说明书的Word 2003文档)。2、设计说明书一份(必须用A4纸打印,不得少于20页)。二、程序中所用的符号及其含义服务器端和客户端程序中用到的符号及其含义:表1 程序中用到的符号及其含义符号含 义nSocketPort标识套
3、接字端口nSocketType标识套接字类型,默认为流式套接字lpszSocketAddress表示套接字的网络地址CClientSocketCSocket类的派生类,使用CSocket类,对对话框类进行前导声明CMySocketCSocket类的派生类, 使用CSocket类,对对话框类进行前导声明三、实现原理(一)网络基础知识1、TCP/IP协议TCP/IP协议,即Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由
4、网络层的IP协议和传输层的TCP协议组成。TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。从协议分层模型方面来讲,TCP/IP由四个层次组成:数据链路层、网络层、数据传输层、应用层。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。二IP是给因特网的每一台联网设备规定一个地址。2、C/S结构C/S结构,即大家熟知的客户机和服务器结构。它是软件系统体
5、系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。C/S结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则。Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行
6、同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。(二)利用WinSock类实现1、Windows Socket类介绍在Visual C+的MFC类库中,提供了两个与WinSock相关的类,分别为CAsyncSocket类和CSocket类。这两个类对WinSock API进行了封装,使得开发Windows Socket应用程序变得简单了。CAsyncSocket类对于WinSock API进行了低级封装,它提供的许多方法直接对应于低层的API函数。在使用CAsyn
7、cSocket时,首先需要调用构造函数创建CAsyncSocket对象,然后调用Create方法创建套接字句柄,对于服务器端的套接字,需要调用Listen方法使其处于监听模式,对于客户端套接字,需要调用Connect方法连接服务器。CSocket类派生于CAsyncSocket,对Windows Socket API进行更高层次的封装。它支持同步操作,可以单独使用,但通常情况下与CSocketFile、CArchive类一起实现数据的发送和接收。2、WinSock类设计网络文字聊天程序整个程序有两个实例组成,即服务器端和客户端。通过创建两个基于对话框的工程,Server(服务器端)和Clien
8、t(客户端)工程,设计在服务器端界面显示服务器的信息,包括服务器名称和端口号,添加一个“监听”按钮,用于监听客户端,通过在对话框中添加AcceptConnect()和ReceiveData()方法,分别用于接受客户端的连接和接收客户端传来的数据;设计在客户端界面上显示三个文本框,其中两个用于输入服务器名称和昵称,以匹配服务器端的自动获取服务器名称和实现用户名进入聊天程序,另一个文本框则提供给用户输入要发送的消息。此外,界面上设置了两个按钮“连接”和“发送”,用于连接服务器和发送消息,中间区域则显示聊天的具体内容,包括文字信息和用户名。四、具体实现方法介绍(一)实现服务器端主要方法1、处理“监听
9、”按钮的单击事件,开始监听客户端。void CServerDlg:OnOK() this-UpdateData(); m_pSocket = new CServerSocket(this); if (!m_pSocket-Create(70) MessageBox(套接字创建失败); delete m_pSocket; m_pSocket = NULL; return; if (!m_pSocket-Listen() MessageBox(监听失败);2、在对话框中添加AcceptConnect方法,用于接受客户端的连接。void CServerDlg:AcceptConnect() CCli
10、entSocket* socket = new CClientSocket(this); /接受客户端的连接 if (m_pSocket-Accept(*socket) m_socketlist.AddTail(socket); else delete socket;3、在对话框中添加ReceiveData方法,用于接收客户端传来的数据。void CServerDlg:ReceiveData(CClientSocket* socket) char bufferdataBUFFERSIZE; /接收客户端传来的数据 int result = socket-Receive(bufferdata,B
11、UFFERSIZE); bufferdataresult = 0; POSITION pos = m_socketlist.GetHeadPosition(); /将数据发送给每个客户端 while (pos!=NULL) CClientSocket* socket = (CClientSocket*)m_socketlist.GetNext(pos); if (socket != NULL) socket-Send(bufferdata,result); (二)实现客户端主要方法1、处理“发送”按钮的单击事件,发送数据到服务器。void CClientDlg:OnButtonsend() /
12、 TODO: Add your control notification handler code here CString str,temp; m_info.GetWindowText(str); if (str.IsEmpty()|m_name.IsEmpty() return; temp.Format(%s说: %s,m_name,str); int num = pMysocket-Send(temp.GetBuffer(temp.GetLength(),temp.GetLength(); m_info.SetWindowText(); m_info.SetFocus();2、在主对话框
13、中定义一个CMysocket对象指针。添加ReceiveData的成员方法,用于接收服务器传来的数据。void CClientDlg:ReceiveData() char buffer200; /接收传来的数据 int factdata = pMysocket-Receive(buffer,200); bufferfactdata = 0; CString str; str.Format(%s,buffer); int i = m_list.GetCount(); /将数据添加到列表框中 m_list.InsertString(m_list.GetCount(),str);3、处理“连接”按钮
14、的单击事件,连接服务器。void CClientDlg:OnButtonjoin() / TODO: Add your control notification handler code here UpdateData(true); CString servername = m_servername; /读取服务器名称 int port; port = 70; /获取端口 if (! pMysocket-Connect(servername,port) /连接服务器 MessageBox(连接服务器失败!); return; CString str; str.Format(%s-%s,m_na
15、me,进入聊天室); int num = pMysocket-Send(str.GetBuffer(0),str.GetLength();五、流程图服务器端、客户端的程序流程图如下:图1 服务器端程序流程图图2 客户端程序流程图六、源程序(一)服务器端主要代码/ ServerDlg.cpp : implementation file#include stdafx.h#include Server.h#include ServerDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE
16、_;#endif/ CAboutDlg dialog used for App Aboutclass 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 DoDataExchange(CDataExchange* pDX
17、); / DDX/DDV support /AFX_VIRTUAL / Implementationprotected: /AFX_MSG(CAboutDlg) /AFX_MSG DECLARE_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
18、g) /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CServerDlg dialogCServerDlg:CServerDlg(CWnd* pParent /*=NULL*/): CDialog(CServerDlg:IDD, pParent) /AFX_DATA_INIT(CServerDlg) /AFX_DATA_INIT / Note that LoadIcon does not re
19、quire a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1);void CServerDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CServerDlg) DDX_Control(pDX, IDC_STATICIP, m_name); DDX_Control(pDX, IDC_STATICPORT, m_port); /AFX_DATA_MAPBEGIN_MESSAGE_MAP
20、(CServerDlg, CDialog)/AFX_MSG_MAP(CServerDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPEND_MESSAGE_MAP()/ CServerDlg message handlersBOOL CServerDlg:OnInitDialog() CDialog:OnInitDialog(); / Add About. menu item to system menu. / IDM_ABOUTBOX must be in the system command range.
21、 ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE);
22、/ 设置大图 SetIcon(m_hIcon, FALSE); / 设置小图 DWORD nSize = MAX_COMPUTERNAME_LENGTH + 1; char BufferMAX_COMPUTERNAME_LENGTH + 1; GetComputerName(Buffer,&nSize); CString str; str.Format(服务器名称:%s,Buffer); m_name.SetWindowText(str); m_port.SetWindowText(服务器端口号:70); return TRUE; / return TRUE unless you set th
23、e focus to a controlvoid CServerDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); / If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applicati
24、ons using the document/view model,/ this is automatically done for you by the framework.void CServerDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / 创建一个设备上下文,用于画图 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / 图片居中显示 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemM
25、etrics(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); else CDialog:OnPaint(); / The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR
26、CServerDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon;void CServerDlg:OnOK() this-UpdateData(); m_pSocket = new CServerSocket(this); if (!m_pSocket-Create(70) MessageBox(套接字创建失败); delete m_pSocket; m_pSocket = NULL; return; if (!m_pSocket-Listen() MessageBox(监听失败);void CServerDlg:AcceptConnect() CCl
27、ientSocket* socket = new CClientSocket(this); /接受客户端的连接 if (m_pSocket-Accept(*socket) m_socketlist.AddTail(socket); else delete socket;void CServerDlg:ReceiveData(CClientSocket* socket) char bufferdataBUFFERSIZE; /接收客户端传来的数据 int result = socket-Receive(bufferdata,BUFFERSIZE); bufferdataresult = 0; P
28、OSITION pos = m_socketlist.GetHeadPosition(); /将数据发送给每个客户端 while (pos!=NULL) CClientSocket* socket = (CClientSocket*)m_socketlist.GetNext(pos); if (socket != NULL) socket-Send(bufferdata,result); (二)客户端主要代码/ ClientDlg.cpp : implementation file#include stdafx.h#include Client.h#include ClientDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1