网络编程课程设计说明书.docx

上传人:b****5 文档编号:3985763 上传时间:2022-11-26 格式:DOCX 页数:28 大小:519.29KB
下载 相关 举报
网络编程课程设计说明书.docx_第1页
第1页 / 共28页
网络编程课程设计说明书.docx_第2页
第2页 / 共28页
网络编程课程设计说明书.docx_第3页
第3页 / 共28页
网络编程课程设计说明书.docx_第4页
第4页 / 共28页
网络编程课程设计说明书.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

网络编程课程设计说明书.docx

《网络编程课程设计说明书.docx》由会员分享,可在线阅读,更多相关《网络编程课程设计说明书.docx(28页珍藏版)》请在冰豆网上搜索。

网络编程课程设计说明书.docx

网络编程课程设计说明书

 

网络编程

课程设计说明书

基于TCP/IP的网络文字聊天程序设计

专业:

网络工程

班级:

1402班

*******

学号:

1********3

时间:

2016年12月26日

 

一、课程设计任务书

(一)设计题目

基于TCP/IP的网络文字聊天程序设计。

(二)设计要求

1、开发平台:

VisualC++6.0

2、对设计方法的要求

使用VisualC++6.0开发出在Windows控制台或图形界面下运行的程序。

3、对设计内容的要求

1实现网络文字聊天程序的服务器端。

2实现网络文字聊天程序的客户端。

3主程序的结构和流程。

4程序运行过程的截图。

5网络文字聊天程序的实现原理。

6网络文字聊天程序实现代码的分析。

4、对课程设计说明书的要求

①设计思路与开发过程。

②对主要代码段要有较详细的注释。

③对本次设计的评价、设计的收获与建议。

5、说明书为打印件

(三)设计内容

实现网络文字聊天程序的基本功能。

(四)设计时间

1周。

(五)设计完成后要上交的材料

1、将说明书和源程序文件与可执行文件,一并存入光盘并上交(以班为单位,每个学生一个文件夹,文件夹名为“学号_姓名”,这个目录下存放工程文件夹与说明书的Word2003文档)。

2、设计说明书一份(必须用A4纸打印,不得少于20页)。

二、程序中所用的符号及其含义

服务器端和客户端程序中用到的符号及其含义:

表1程序中用到的符号及其含义

符号

含义

nSocketPort

标识套接字端口

nSocketType

标识套接字类型,默认为流式套接字

lpszSocketAddress

表示套接字的网络地址

CClientSocket

CSocket类的派生类,使用CSocket类,对对话框类进行前导声明

CMySocket

CSocket类的派生类,使用CSocket类,对对话框类进行前导声明

三、实现原理

(一)网络基础知识

1、TCP/IP协议

TCP/IP协议,即TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。

TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。

从协议分层模型方面来讲,TCP/IP由四个层次组成:

数据链路层、网络层、数据传输层、应用层。

TCP/IP定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

通俗而言:

TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。

二IP是给因特网的每一台联网设备规定一个地址。

2、C/S结构

C/S结构,即大家熟知的客户机和服务器结构。

它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

C/S结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则。

Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。

目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。

这也就是目前应用系统的发展方向。

(二)利用WinSock类实现

1、WindowsSocket类介绍

在VisualC++的MFC类库中,提供了两个与WinSock相关的类,分别为CAsyncSocket类和CSocket类。

这两个类对WinSockAPI进行了封装,使得开发WindowsSocket应用程序变得简单了。

CAsyncSocket类对于WinSockAPI进行了低级封装,它提供的许多方法直接对应于低层的API函数。

在使用CAsyncSocket时,首先需要调用构造函数创建CAsyncSocket对象,然后调用Create方法创建套接字句柄,对于服务器端的套接字,需要调用Listen方法使其处于监听模式,对于客户端套接字,需要调用Connect方法连接服务器。

CSocket类派生于CAsyncSocket,对WindowsSocketAPI进行更高层次的封装。

它支持同步操作,可以单独使用,但通常情况下与CSocketFile、CArchive类一起实现数据的发送和接收。

2、WinSock类设计网络文字聊天程序

整个程序有两个实例组成,即服务器端和客户端。

通过创建两个基于对话框的工程,Server(服务器端)和Client(客户端)工程,设计在服务器端界面显示服务器的信息,包括服务器名称和端口号,添加一个“监听”按钮,用于监听客户端,通过在对话框中添加AcceptConnect()和ReceiveData()方法,分别用于接受客户端的连接和接收客户端传来的数据;设计在客户端界面上显示三个文本框,其中两个用于输入服务器名称和昵称,以匹配服务器端的自动获取服务器名称和实现用户名进入聊天程序,另一个文本框则提供给用户输入要发送的消息。

此外,界面上设置了两个按钮“连接”和“发送”,用于连接服务器和发送消息,中间区域则显示聊天的具体内容,包括文字信息和用户名。

四、具体实现方法介绍

(一)实现服务器端主要方法

1、处理“监听”按钮的单击事件,开始监听客户端。

voidCServerDlg:

:

OnOK()

{

this->UpdateData();

m_pSocket=newCServerSocket(this);

if(!

m_pSocket->Create(70))

{

MessageBox("套接字创建失败");

deletem_pSocket;

m_pSocket=NULL;

return;

}

if(!

m_pSocket->Listen())

MessageBox("监听失败");

}

2、在对话框中添加AcceptConnect方法,用于接受客户端的连接。

voidCServerDlg:

:

AcceptConnect()

{

CClientSocket*socket=newCClientSocket(this);

//接受客户端的连接

if(m_pSocket->Accept(*socket))

m_socketlist.AddTail(socket);

else

deletesocket;

}

3、在对话框中添加ReceiveData方法,用于接收客户端传来的数据。

voidCServerDlg:

:

ReceiveData(CClientSocket*socket)

{

charbufferdata[BUFFERSIZE];

//接收客户端传来的数据

intresult=socket->Receive(bufferdata,BUFFERSIZE);

bufferdata[result]=0;

POSITIONpos=m_socketlist.GetHeadPosition();

//将数据发送给每个客户端

while(pos!

=NULL)

{

CClientSocket*socket=(CClientSocket*)m_socketlist.GetNext(pos);

if(socket!

=NULL)

socket->Send(bufferdata,result);

}

}

(二)实现客户端主要方法

1、处理“发送”按钮的单击事件,发送数据到服务器。

voidCClientDlg:

:

OnButtonsend()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CStringstr,temp;

m_info.GetWindowText(str);

if(str.IsEmpty()|m_name.IsEmpty())

return;

temp.Format("%s说:

%s",m_name,str);

intnum=pMysocket->Send(temp.GetBuffer(temp.GetLength()),temp.GetLength());

m_info.SetWindowText("");

m_info.SetFocus();

}

2、在主对话框中定义一个CMysocket对象指针。

添加ReceiveData的成员方法,用于接收服务器传来的数据。

voidCClientDlg:

:

ReceiveData()

{

charbuffer[200];

//接收传来的数据

intfactdata=pMysocket->Receive(buffer,200);

buffer[factdata]='\0';

CStringstr;

str.Format("%s",buffer);

inti=m_list.GetCount();

//将数据添加到列表框中

m_list.InsertString(m_list.GetCount(),str);

}

3、处理“连接”按钮的单击事件,连接服务器。

voidCClientDlg:

:

OnButtonjoin()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(true);

CStringservername=m_servername;//读取服务器名称

intport;

port=70;//获取端口

if(!

pMysocket->Connect(servername,port))//连接服务器

{

MessageBox("连接服务器失败!

");

return;

}

CStringstr;

str.Format("%s----->%s",m_name,"进入聊天室");

intnum=pMysocket->Send(str.GetBuffer(0),str.GetLength());

}

五、流程图

服务器端、客户端的程序流程图如下:

图1服务器端程序流程图

图2客户端程序流程图

六、源程序

(一)服务器端主要代码

//ServerDlg.cpp:

implementationfile

#include"stdafx.h"

#include"Server.h"

#include"ServerDlg.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

//CAboutDlgdialogusedforAppAbout

classCAboutDlg:

publicCDialog

{

public:

CAboutDlg();

//DialogData

//{{AFX_DATA(CAboutDlg)

enum{IDD=IDD_ABOUTBOX};

//}}AFX_DATA

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport

//}}AFX_VIRTUAL

//Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg:

:

CAboutDlg():

CDialog(CAboutDlg:

:

IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

voidCAboutDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

//Nomessagehandlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//CServerDlgdialog

CServerDlg:

:

CServerDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CServerDlg:

:

IDD,pParent)

{

//{{AFX_DATA_INIT(CServerDlg)

//}}AFX_DATA_INIT

//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32

m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);

}

voidCServerDlg:

:

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_MAP

}

BEGIN_MESSAGE_MAP(CServerDlg,CDialog)

//{{AFX_MSG_MAP(CServerDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//CServerDlgmessagehandlers

BOOLCServerDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//设置大图

SetIcon(m_hIcon,FALSE);//设置小图

DWORDnSize=MAX_COMPUTERNAME_LENGTH+1;

charBuffer[MAX_COMPUTERNAME_LENGTH+1];

GetComputerName(Buffer,&nSize);

CStringstr;

str.Format("服务器名称:

%s",Buffer);

m_name.SetWindowText(str);

m_port.SetWindowText("服务器端口号:

70");

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

voidCServerDlg:

:

OnSysCommand(UINTnID,LPARAMlParam)

{

if((nID&0xFFF0)==IDM_ABOUTBOX)

{

CAboutDlgdlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog:

:

OnSysCommand(nID,lParam);

}

}

//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow

//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,

//thisisautomaticallydoneforyoubytheframework.

voidCServerDlg:

:

OnPaint()

{

if(IsIconic())

{

CPaintDCdc(this);//创建一个设备上下文,用于画图

SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

//图片居中显示

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

intx=(rect.Width()-cxIcon+1)/2;

inty=(rect.Height()-cyIcon+1)/2;

//画图

dc.DrawIcon(x,y,m_hIcon);

}

else

{

CDialog:

:

OnPaint();

}

}

//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags

//theminimizedwindow.

HCURSORCServerDlg:

:

OnQueryDragIcon()

{

return(HCURSOR)m_hIcon;

}

voidCServerDlg:

:

OnOK()

{

this->UpdateData();

m_pSocket=newCServerSocket(this);

if(!

m_pSocket->Create(70))

{

MessageBox("套接字创建失败");

deletem_pSocket;

m_pSocket=NULL;

return;

}

if(!

m_pSocket->Listen())

MessageBox("监听失败");

}

voidCServerDlg:

:

AcceptConnect()

{

CClientSocket*socket=newCClientSocket(this);

//接受客户端的连接

if(m_pSocket->Accept(*socket))

m_socketlist.AddTail(socket);

else

deletesocket;

}

voidCServerDlg:

:

ReceiveData(CClientSocket*socket)

{

charbufferdata[BUFFERSIZE];

//接收客户端传来的数据

intresult=socket->Receive(bufferdata,BUFFERSIZE);

bufferdata[result]=0;

POSITIONpos=m_socketlist.GetHeadPosition();

//将数据发送给每个客户端

while(pos!

=NULL)

{

CClientSocket*socket=(CClientSocket*)m_socketlist.GetNext(pos);

if(socket!

=NULL)

socket->Send(bufferdata,result);

}

}

(二)客户端主要代码

//ClientDlg.cpp:

implementationfile

#include"stdafx.h"

#include"Client.h"

#include"ClientDlg.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1