网络编程课程设计说明书Word文档格式.docx
- 文档编号:16892684
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:28
- 大小:519.29KB
网络编程课程设计说明书Word文档格式.docx
《网络编程课程设计说明书Word文档格式.docx》由会员分享,可在线阅读,更多相关《网络编程课程设计说明书Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
③对本次设计的评价、设计的收获与建议。
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;
}
Listen())
监听失败"
}
2、在对话框中添加AcceptConnect方法,用于接受客户端的连接。
AcceptConnect()
CClientSocket*socket=newCClientSocket(this);
//接受客户端的连接
if(m_pSocket->
Accept(*socket))
m_socketlist.AddTail(socket);
else
deletesocket;
3、在对话框中添加ReceiveData方法,用于接收客户端传来的数据。
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())
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的成员方法,用于接收服务器传来的数据。
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、处理“连接”按钮的单击事件,连接服务器。
OnButtonjoin()
UpdateData(true);
CStringservername=m_servername;
//读取服务器名称
intport;
port=70;
//获取端口
pMysocket->
Connect(servername,port))//连接服务器
连接服务器失败!
%s----->
m_name,"
进入聊天室"
Send(str.GetBuffer(0),str.GetLength());
五、流程图
服务器端、客户端的程序流程图如下:
图1服务器端程序流程图
图2客户端程序流程图
六、源程序
(一)服务器端主要代码
//ServerDlg.cpp:
implementationfile
#include"
stdafx.h"
Server.h"
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
//{{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)
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->
LoadIcon(IDI_ICON1);
//{{AFX_DATA_MAP(CServerDlg)
DDX_Control(pDX,IDC_STATICIP,m_name);
DDX_Control(pDX,IDC_STATICPORT,m_port);
BEGIN_MESSAGE_MAP(CServerDlg,CDialog)
//{{AFX_MSG_MAP(CServerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//CServerDlgmessagehandlers
BOOLCServerDlg:
OnInitDialog()
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
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);
服务器名称:
Buffer);
m_name.SetWindowText(str);
m_port.SetWindowText("
服务器端口号:
70"
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
CDialog:
OnSysCommand(nID,lParam);
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
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);
OnPaint();
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCServerDlg:
OnQueryDragIcon()
return(HCURSOR)m_hIcon;
(二)客户端主要代码
//ClientDlg.cpp:
Client.h"
ClientDlg.h"
staticcharTHIS_FILE[]=_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 课程设计 说明书