软件技术专业毕业实习报告.docx
《软件技术专业毕业实习报告.docx》由会员分享,可在线阅读,更多相关《软件技术专业毕业实习报告.docx(40页珍藏版)》请在冰点文库上搜索。
软件技术专业毕业实习报告
《软件实习》
专业班级
学号
姓名
指导老师
厦门软件学院
[实习目的]
熟练掌握一门工具,对B/S,C/S框架有一定了解,在此基础上编写一些基本的服务程序。
[实习内容]
我们这次做的是一个FTP客户端程序。
采用的是B/S框架模式。
可以通过客户端从服务器下载数据,或向服务器传送数据。
[FTP思想概述]
FTP是通过两个连接实现的。
有一个连接总是保持的,即控制连接,通过这个连接,客户端向服务器发送命令并从服务器取得对命令的应答,通过应答,客户端可以知道命令最后执行的结果如何。
另一个是数据连接,数据连接只有在服务器与客户端有数据连接的时候才建立服务器上文件目录信息,上传下载文件都是通过这个数据连接进程的。
另外,数据传输使用的是反向连接,即客户端穿件数据连接套接字的服务器端,然后向服务器端发送PORT命令,让FTP服务器来反向连接客户端。
[主要类框架]
FtpclientDlg为这个客户端的主要框架类,里面包含了5个类。
1,CFtpClientDlg:
publicCDialog为这个客户端的对话框类。
2,CControlSock:
publicCAsyncSocket控制连接,用于服务器与客户端的命令及应答传输。
成员变量:
m_SendBuffer,m_Receive:
存放命令的序列,连接到一个链表。
*m_dlg:
主对话框指针,用于显示对话框中的数据
Sendcmd:
向服务器发送命令
重载了OnRecive,OnSend两个函数
3,CListenSock:
publicCAsynSocket监听连接,将数据传输情况下监听服务器连接请求。
主要重载OnAccept函数
4,CDataSock:
publicCAsynSocket数据连接,用于显示服务器目录信息及文件数据传输。
成员变量:
m_ReceiveBuffer:
存放命令的序列,连接到一个链表。
*m_dlg:
主对话框指针,用于显示对话框中的数据
*m_pFile:
文件指针,上传下载文件时打开本地文件用于读写。
5,CFtp封装Ftp基本操作。
USER:
用户名
PASS:
密码
CWD:
改变文件目录
TYPE:
文件类型
CDUP:
向上层目录
LIST:
目录下的文件列表
RETR:
下载服务器上指定目录的而文件
STOR:
向服务器上传文件
成员函数:
ConnectServer:
用于连接到一个指定的FTP服务器
Put:
上传文件至服务器
Get:
从服务器上下载指定文件到本地
ChangeDirDown:
进入服务器上一子目录
ChangeDirUp:
进入服务器上的上一层目录
6.CFtpClientDlg中的一些消息相应函数
OnClickList1:
“服务器文件目录列表”列表框的单击事件相应函数
OnDbclkList1:
“服务器文件目录列表”列表框的双击事件相应函数OnConnect:
按钮“连接”的单击时间响应函数
OnDisconnect:
按钮“断开”的单击时间响应函数
OnDirup:
按钮“上层父目录”的单击时间响应函数
OnDirdown:
按钮“进入子目录”的单击时间响应函数
OnGet:
按钮“下载本文件”的单击时间响应函数
OnPut:
按钮“上传文件”的单击时间响应函数
[主要代码]
#include"stdafx.h"
#include"FtpClient.h"
#include"FtpClientDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//CAboutDlgdialogusedforAppAbout
/////////globalvar/////////////////////
inttransfortype;
CDataSock*m_dataSock=NULL;
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()
//CFtpClientDlgdialog
CFtpClientDlg:
:
CFtpClientDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CFtpClientDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CFtpClientDlg)
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_imgs.Create(IDB_BITMAP1,16,2,RGB(255,255,255));
ftpclient=NULL;
}
voidCFtpClientDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFtpClientDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFtpClientDlg,CDialog)
//{{AFX_MSG_MAP(CFtpClientDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(NM_CLICK,IDC_LIST1,OnClickList1)
ON_NOTIFY(NM_DBLCLK,IDC_LIST1,OnDblclkList1)
ON_BN_CLICKED(IDC_CONNECT,OnConnect)
ON_BN_CLICKED(IDC_DISCONNECT,OnDisconnect)
ON_BN_CLICKED(IDC_DIRUP,OnDirup)
ON_BN_CLICKED(IDC_DIRDOWN,OnDirdown)
ON_BN_CLICKED(IDC_GET,OnGet)
ON_BN_CLICKED(IDC_PUT,OnPut)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CFtpClientDlgmessagehandlers
BOOLCFtpClientDlg:
:
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);
}
}
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
CListCtrl*m_list;
m_list=(CListCtrl*)GetDlgItem(IDC_LIST1);
m_list->InsertColumn(0,"文件名",LVCFMT_LEFT,90);
m_list->InsertColumn(1,"文件长度",LVCFMT_LEFT,70);
m_list->InsertColumn(2,"创建日期",LVCFMT_LEFT,90);
m_list->InsertColumn(3,"文件属性",LVCFMT_LEFT,105);
m_list->SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list->SetImageList(&m_imgs,LVSIL_SMALL);
CEdit*edit;
edit=(CEdit*)GetDlgItem(IDC_SERVERT_PORT);
edit->SetWindowText("21");
edit=(CEdit*)GetDlgItem(IDC_USR);
edit->SetWindowText("anonymous");
edit=(CEdit*)GetDlgItem(IDC_PASS);
edit->SetWindowText("1@");
((CButton*)GetDlgItem(IDC_DISCONNECT))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_DIRUP))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_PUT))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_GET))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_DIRDOWN))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_DIRUP))->EnableWindow(false);
((CListCtrl*)GetDlgItem(IDC_LIST1))->EnableWindow(false);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCFtpClientDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
voidCFtpClientDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
HCURSORCFtpClientDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
//CContrlSock
CContrlSock:
:
CContrlSock()
{
}
CContrlSock:
:
~CContrlSock()
{
}
//Donoteditthefollowinglines,whichareneededbyClassWizard.
#if0
BEGIN_MESSAGE_MAP(CContrlSock,CAsyncSocket)
//{{AFX_MSG_MAP(CContrlSock)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif//0
///控制套接字向服务器发送命令
voidCContrlSock:
:
sendcmd()
{
CStringSendBuffer;
intn;
///如果命令链表不空
if(!
m_SendBuffer.IsEmpty())
{
//取出链表头的澳门百家乐一条命令字符串并将其从链表中删除
SendBuffer=m_SendBuffer.RemoveHead();
//发送该命令字符串
n=Send(SendBuffer,SendBuffer.GetLength());
//如果命令发送失败
if(SOCKET_ERROR==n)
{
//m_pFtpView->MessageBox("Errorhappenedwhensendingcommandtohost!
","Error");
}
//如果命令字符串没有完全发送出去
elseif(n{
//将未发送出去的字符串保存,留待下次发送
SendBuffer=SendBuffer.Right(SendBuffer.GetLength()-n);
m_SendBuffer.AddHead(SendBuffer);
}
}
}
voidCContrlSock:
:
OnReceive(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CStringBuffer,Command;
charbuffer[256],*pBuffer,*p1,*p2;
intn,nCommand;
if(SOCKET_ERROR==(n=Receive(buffer,255)))
return;
buffer[n]='\0';
m_ReceiveBuffer+=buffer;
Buffer=m_ReceiveBuffer;
m_ReceiveBuffer.Empty();
if(!
Buffer.IsEmpty())
{
pBuffer=(char*)(LPCSTR)Buffer;
p1=pBuffer;
pBuffer+=n;
while(p1{
p2=strstr(p1,"\r\n");
if(NULL!
=p1)
{
strncpy((char*)Command.GetBuffer(p2-p1+3),p1,p2-p1+2)
[p2-p1+2]='\0';
p1=p2+2;
Command.ReleaseBuffer();
}
else
{
m_ReceiveBuffer=p1;
break;
}
CEdit*edit=(CEdit*)m_dlg->GetDlgItem(IDC_EDIT_INFO);
m_dlg->outinfo+=Command;
edit->SetWindowText(m_dlg->outinfo);
if(3{
if(isdigit(Command[0])&&isdigit(Command[1])&&isdigit(Command[2])
&&(''==Command[3]))
{
sscanf(Command,"%d",&nCommand);
switch(nCommand)
{
//对于命令usr和passwd的应答
case230:
((CButton*)m_dlg->GetDlgItem(IDC_DISCONNECT))->EnableWindow(true);
((CButton*)m_dlg->GetDlgItem(IDC_DIRUP))->EnableWindow(true);
((CButton*)m_dlg->GetDlgItem(IDC_PUT))->EnableWindow(true);
((CListCtrl*)m_dlg->GetDlgItem(IDC_LIST1))->EnableWindow(true);
default:
if((nCommand<200)||(nCommand>=400)||(332==nCommand))
break;
OnSend(0);
break;
//对于命令port
case200:
OnSend(0);
break;
case421:
((CButton*)m_dlg->GetDlgItem(IDC_DISCONNECT))->EnableWindow(false);
((CButton*)m_dlg->GetDlgItem(IDC_DIRUP))->EnableWindow(false);
((CButton*)m_dlg->GetDlgItem(IDC_PUT))->EnableWindow(false);
((CButton*)m_dlg->GetDlgItem(IDC_DIRDOWN))->EnableWindow(false);
((CButton*)m_dlg->GetDlgItem(IDC_DIRUP))->EnableWindow(false);
((CListCtrl*)m_dlg->GetDlgItem(IDC_LIST1))->EnableWindow(false);
break;
}
}
}
}
}
}
//CListenSock
CListenSock:
:
CListenSock()
{
}
CListenSock:
:
~CListenSock()
{
}
//Donoteditthefollowinglines,whichareneededbyClassWizard.
#if0
BEGIN_MESSAGE_MAP(CListenSock,CAsyncSocket)
//{{AFX_MSG_MAP(CListenSock)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif//0
//CListenSockmemberfunctions
voidCListenSock:
:
OnAccept(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
if(NULL!
=m_dataSock)
{
Accept(*m_dataSock);
//如果是下载文件或者取得服务器上文件信息
if(transfortype==1||transfortype==2)
//为套接字请求事件通知
m_dataSock->AsyncSelect(FD_READ|FD_CLOSE);
//如果是上载文件
if(transfortype==3)
//为套接字请求事件通知
m_dataSock->AsyncSelect(FD_WRITE|FD_CLOSE);
}
}
//C