软件技术实习报告
软件技术>实习报告(一)
本人自XX年9月份参加工作 至今,六个月的实习时间已经结束。在这段时间里,在领导和同事们的悉心关怀和指导下,通过自己的不懈努力,在各方面都取得了进步。
实践让我的技能不断增长,工作能力不断加强。刚开始工作的时候,发现自己以前在学校学习的知识很死,知识面很窄,以前做的练习项目的实用性也不是很好。在开始的几周公司给我们实习员工>培训了xxxx平台的使用,通过这次培训使我认识到xxxx平台的优势,可以大大提高软件开发效率。
随后我就加入到'xxxxx税源控管系统'项目的开发中,成为开发小组中的一员。在项目开发过程中一边是同事们的悉心指导,一边是自己反复琢磨与理解,几个月下来大大提高了自己业务和技术两方面的技能,已经能够比较熟练的掌握基本的工作方法和一些技巧 ,而且能够独立完成一些模块的开发。
通过实践,我解决实际问题 的能力得到了很好的锻炼。工作中也遇到了很多的以前没有遇到过的新技术,面对技术难题我总是直接面对,没有逃避,也因此自学了好多新的技术,大大提高了自己的自学能力,也加深了对自己工作要负责的信念。在项目开发过程中也遇到了一些自己确实无法解决的困难,在经理和同事的帮助下也顺利的解决了,在此表示感谢。
在开发团队中,加强了自己的团结精神和集体感,对工作认真负责,对团队认真负责。通过这个项目不仅学习到了很多技术也了解了整个项目的大体流程,从需求分析、数据库设计、详细设计、代码编写、测试、项目维护等方面,使自己不仅从一个代码编>写人员的角度还从一个整体的角度来看整个项目开发,加深了软件开发概念的理解。
不断学习使我对工作有了更进一步的认识和了解。不懂就学、就问,是一切进步取得的前提和基础。因为有大学专业课的底子和参加过专门的java培训使我在工作过程中遇到的技术知识能更快的理解和掌握。工作中时常遇到新的问题,就需要查阅相关资料,请教同事和经理,一个问题一个问题的解决,一个困难一个困难的克服,不仅将原有知识温习巩固,产生新的理解,而且学到很多新知识,有了许多新的认识。但某些认识都还是肤浅的,还需要我在实践当中去不断深入地理解。
现场开发与维护使我不仅从一个开发人员的角度而且从客户的角度去思考问题。在项目的开发后期,也就是项目即将上线的阶段我与其他几位同事被派往现场去开发与维护项目。以前的开发都是根据需求分析来进行,功能要求一般在分析里面都写的很清楚,但是在现场开发直接面对客户,客户提出的需求一开始只是一个大体的功能描述,如何将这个只是语言描述的功能转化为技术实现需要很强的抽象能力和对业务的深入理解,这个过程大大锻炼了自己的综合能力。在第一时间接触客户的需求,从客户的角度思考问题,只有更了解客户需求才能更合理的设计软件的结构,功能。
软件技术实习报告(二)
时间忽忽,转眼间,在温州创力电子有限公司的实习期马上就要接近尾声了。通过这两个月的实习,我接触到了真正的规模、工作,亲自尝试了网页测试,设计讨论,不敢说是真正的从课本中走到了现实中了,但也有十九八九了,从抽象的理论来到五彩缤纷的实际生活,细致的了解了现实业务的处理流程,认真的观摩了前辈们针对web、采集相关的处理,使我对于web的认识从纯理性上升到实践中,从实践中的感性认识上升到更深刻的理性知识。在学校总以为自己学的还是不赖的,一旦到实践,我才慢慢发现自己的技术水平、能力都远远没有达到这行业的工作要求,实际的工作要比想象中的要细致、复杂。这时才真正领悟到什么是“活到老学到老”的含义。实际工作能力是学校、书本上没办法教授给我们的,必须要通过实际经验 、工作来积累与强化自我。将所学的知识转化为工作能力,这样才真正的做到了学有所用。
五月的工作的确很累,每天拖着疲惫的身子回宿舍,但是后面也渐渐就习惯了。不断有新的知识学到,心里有一种充实感。
在这段实习的时间里,我经历 了很多以前没有的事,就比如第一次领工资虽然只是一点点的钱,但却是我人生的转折点,一个人在他的学生时代最重要的是学习东西,增长见识,锻炼能力,尤其在大学学习时候,参于社会实践 活动是一个很好的锻炼机会,赚钱不是主要的,作为学生,能赚多少钱,等你毕业了有的是赚钱的机会,这回可是我长这么大第一次用自己的双手和智慧挣来的钱,当时我真的是激动的要哭,那种感觉真的是无法形容的美妙。
两个月实习满后,我带着学到的知识将要离开这里,从实习公司里我学到了很多,总结出来了下面几点找工作的经验:
一、 继续学习,不断提升自我。
在信息时代,学习是不断的汲取新信息,获取事业进步的动力,作为青年人更应该把学习作为保证工作积极性的重要途径。走上岗位后,我会积极响应单位号召,结合工作实际,不断学习知识,用先进的理论武装头脑,用精良的业务知识提升能力,以广博的社会知识拓展视野。
二、 努力实践
只要将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是通过实践活动来实现的,也只有通过实践才能更好的锻炼人的品质和意志。必须在实际的工作和生活中体会,并且自觉的进行角色的转换。
在实习期间也有几点体会:
1.首先是个人角色的转换及整个人际 关系的变化——学校里成绩不错的学生变成了未知领域里从头学起的实习生,而熟悉的校园也变成了陌生的企业单位,身边接触的
人同样改变了角色:老师变成了领导,同学变成了同事,相处之道完全不同。在这样的转变中,对于沟通的认知显得非常苍白。于是第一次觉得自己并没有本以为的那么善于沟通。当然,适应新的环境是需要过程的,所以我相信时间和实践会让我很快完成这种角色的转变,真正融入到工作单位这个与学校全然不同的社会大环境中。
2.走出校门,踏进社会,不能把自己要求太高。因为期望越大,失望可能会越大,但适当的期望与渴望还是非常必要的。不能认为我在学校里读了多少本书、写了多少万字、听了多少堂课,自己了不起了。我毕竟还是一个初出茅庐的小丫头,没有任何实践经验,比起工人师傅来还差得很远。学校生活暂告一段,社会生活刚刚起步,应该在步入社会后,继续学习,不断增长和扩展知识面,才能使自己在社会占有一席之地。
实习是为将来打基础的重要阶段,珍惜自己每一个工作的机会,不论什么人,什么学历,从事什么工作,好好的表现、展示自己的能力,不要错过好的机遇。没有一件事情是轻轻松松的,但每一件事都是让人成长的,经历一段过程,喜悦或是艰辛,尽管经历的方式不尽相同,但它的结果是相同的,我们都会因涉事而成长。
软件技术实习报告(三)
一、实习目的
1、通过实习能够加强和巩固理论知识,能够在实践中培养自己发现问题并运用所学知识分析问题和解决问题的能力,从而使我们在学校所学的知识能够应用到实践当中去。
2、锻炼自己的实习工作能力,适应社会能力和自我管理的能力,提前感受工作的感觉,为以后的就业 打下一定的基础。
3、了解计算机软件技术在应用情况、需求情况和发展方向及前景。
4、希望能在实习单位学到一些自己在学校难以学到的知识,为>毕业设计的顺利完成添砖加瓦。
二、实习内容
北京德润兴业科技开发有限公司,它就是我这次实习的单位。该公司是一个以it网络技术研发、国内国际软件系统集成及其它高科技产品研发为主要业务的高科技企业。公司位于中关村海淀科技园区内,特聘一批学界知名的教授、博士、硕士以及高级程序员 ,组成一支强有力的科技人才主力军。我所实习的项目组是税源监控管理平台项目组,它是国家>税务总局委托我们公司开发的一款税务管理及监控软件。
进入公司的第一天,负责管理我们的项目组长带带我们参观了下公司,熟悉公司的工作环境,然后简单的介绍了下公司的情况,以及税源监控管理平台的应用实施情况,从中我们得知该软件现在已经比较成熟了,现在正在向全国各地推广。
随后的几天公司准备了一些该软件的技术资料给我们看,从中我们知道了该软件的一些核心技术是什么,运行原理是什么,核心功能是什么。该平台系统是基于j2ee的mvc架构,使用oracle作为数据库,采用b/s结构,用weblogic或者tomcat等作为服务器的这么一款软件,它主要是利用数据间的监控比对,发现税收征管的异常数据,为税收管理提供准确及时的数据支持。
看完资料后,项目组长就教我们如何部署该系统了。
首先是安装各种应用软件,首先安装oracle,安装 oracle时我们还是遇到了许多的问题,例如我们刚开始时我们根本登陆不了我们自己创建的数据库,随后在组长的指导下,原来是监听服务没有开启。还有我们还学到了如何给一些用户授权等等。随后我们
就开始安装tomcat,在这当中我们学会了,如何正确的配置环境变量。tomcat安装好后,我们就将公司为我们准备好的工程部署到tomcat下。最后是导入数据库到oracle中,这个也是我这次实习当中学到的一点小技术。成功部署后,我们就能够成功登录到进系统了。
这样安装的软件只是在自己的电脑上而已,别人是访问不了的,在接下来的几天,我们就学习了,如何在用户那里安装我们的软件。我们用一台电脑安装oracle,让它做数据库服务器,一台电脑业安装oracle,它是数据采集服务器,还用一台电脑也安装了oracle,它是作为数据库备份服务器的,最后一台是应用服务器,安装tomcat,并且将系统发布到tomcat下面,使在该局域网内的电脑都能够正常访问。
三、实习结果
通过这一个多月的实习,使我了解了一个系统是如何从开发阶段到成功部署到用户的过程。知道了怎么去安装一些工具软件,怎么去成功部署项目。同时也锻炼自己的实习工作能力,适应社会能力和自我管理的能力,提前感受工作的感觉,为以后的就业打下一定的基础。
四、实习总结
在这次实习当中我是感触良多。
首先,就是我们在学校学的理论知识跟实际的软件开发还是有很大的差距,而且我们在学校学的东西都是比较过时的知识了,有许多的问题是书上面没法子学到的,正是那句话说的好“纸上得来终觉浅,绝知此事要躬行”。
其次,我们就是要多学习 ,软件方面的知识是学海无涯,我们必须不断地学习才能跟上这个行业的发展,当然我们还得集中精力,有的放矢的去学,这样我们才能在有限的时间内学习到尽量多的知识。软件方面的总是更新的很快,这个就迫使我们必须的不断地学习总结。
最后就是,跟同事相处必须融洽,有什么技术方面的问题多问下这些前辈,有什么业务方面的事就多问下领导,彼此必须多沟通,多交流。真诚待人,方能得到同事和领导的认可。同事之间多点协同合作,尽量去团结同事,使自己有一个融洽、团结的工作环境。
实习的同时也让我了解到了自己的许多不足,在今后工作与学习的过程中,我会继续努力,完善自我,使自己成为一个软件方面合格的从业人员。
第二篇:软件技术专业毕业实习报告
《软件实习》
专业班级 学 号 姓 名 指导老师
厦门软件学院
[ 实习目的 ]
熟练掌握一门工具,对B/S,C/S框架有一定了解,在此基础上编写一些基本的服务程序。
[ 实习内容 ]
我们这次做的是一个FTP客户端程序。采用的是B/S框架模式。可以通过客户端从服务器下载数据,或向服务器传送数据。
[ FTP思想概述 ]
FTP是通过两个连接实现的。
有一个连接总是保持的,即控制连接,通过这个连接,客户端向服务器发送命令并从服务器取得对命令的应答,通过应答,客户端可以知道命令最后执行的结果如何。
另一个是数据连接,数据连接只有在服务器与客户端有数据连接的时候才建立服务器上文件目录信息,上传下载文件都是通过这个数据连接进程的。
另外,数据传输使用的是反向连接,即客户端穿件数据连接套接字的服务器端,然后向服务器端发送PORT命令,让FTP服务器来反向连接客户端。
[主要类框架]
FtpclientDlg 为这个客户端的主要框架类,里面包含了5个类。 1,CFtpClientDlg: public CDialog 为这个客户端的对话框类。 2,CControlSock : public CAsyncSocket 控制连接,用于服务器与客户端的命令及应答传输。
成员变量:m_SendBuffer,m_Receive:存放命令的序列,连接到一个链表。
*m_dlg :主对话框指针,用于显示对话框中的数据 Sendcmd:向服务器发送命令
重载了OnRecive,OnSend两个函数
3,CListenSock : public CAsynSocket 监听连接,将数据传输情况下监听服务器连接请求。
主要重载OnAccept函数
4,CDataSock : public CAsynSocket 数据连接,用于显示服务器目录信息及文件数据传输。
成员变量: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
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
// CAboutDlg dialog used for App About /////////global var///////////////////// int transfortype;
CDataSock *m_dataSock=NULL;
class CAboutDlg : public CDialog
{ public: 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); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected:
//{{AFX_MSG(CAboutDlg) //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {
//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void
CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP END_MESSAGE_MAP()
// CFtpClientDlg dialog
CFtpClientDlg::CFtpClientDlg(CWnd*
pParent /*=NULL*/)
: CDialog(CFtpClientDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CFtpClientDlg) //}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon =
AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_imgs.Create(IDB_BITMAP1, 16, 2, RGB(255,255,255));
ftpclient=NULL; } void
CFtpClientDlg::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()
// CFtpClientDlg message handlers
BOOL CFtpClientDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Add "About..." menu item to system
menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
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); }
}
SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE);// Set small icon
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@263.net");
((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);
return TRUE; // return TRUE unless you set the focus to a control }
void CFtpClientDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout; dlgAbout.DoModal();
} else { CDialog::OnSysCommand(nID, lParam);
}
}
void CFtpClientDlg::OnPaint() {
if (IsIconic()) {
CPaintDC dc(this); // device context
for painting
SendMessage(WM_ICONERASEBKGND,
(WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int 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 icon
dc.DrawIcon(x, y, m_hIcon);
} else { CDialog::OnPaint(); }
}
HCURSOR CFtpClientDlg::OnQueryDragIcon() {
return (HCURSOR) m_hIcon; }
// CContrlSock
CContrlSock::CContrlSock() { }
CContrlSock::~CContrlSock() { }
// Do not edit the following lines, which are needed by ClassWizard. #if 0
BEGIN_MESSAGE_MAP(CContrlSock, CAsyncSocket)
//{{AFX_MSG_MAP(CContrlSock) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif // 0
///控制套接字向服务器发送命令 void CContrlSock::sendcmd() {
CString SendBuffer; int n;
///如果命令链表不空
if (!m_SendBuffer.IsEmpty()) {
//取出链表头的澳门百家乐一条命令字
符串并将其从链表中删除
SendBuffer =
m_SendBuffer.RemoveHead();
//发送该命令字符串
n = Send(SendBuffer,
SendBuffer.GetLength()); //如果命令发送失败 if (SOCKET_ERROR == n) { //
m_pFtpView->MessageBox("Error happened when sending command to host!", "Error");
}
//如果命令字符串没有完全发送出去 else if (n < SendBuffer.GetLength()) {
//将未发送出去的字符串保存,留待下次发送
SendBuffer =
SendBuffer.Right(SendBuffer.GetLength() - n);
m_SendBuffer.AddHead(SendBuffer); }
} }
void CContrlSock::OnReceive(int nErrorCode) {
// TODO: Add your specialized code here and/or call the base class CString Buffer, Command;
char buffer[256], *pBuffer, *p1, *p2; int n, 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 < pBuffer) { 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 < Command.GetLength()) {
if (isdigit(Command[0])
&& isdigit(Command[1]) && isdigit(Command[2])
&& (' ' ==
Command[3])) {
sscanf(Command, "%d",
&nCommand); switch (nCommand) {
//对于命令usr和
passwd的应答 case 230:
((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 case 200: OnSend(0);
break;
case 421:
((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() { }
// Do not edit the following lines, which are needed by ClassWizard. #if 0
BEGIN_MESSAGE_MAP(CListenSock, CAsyncSocket)
//{{AFX_MSG_MAP(CListenSock) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif // 0
// CListenSock member functions
void CListenSock::OnAccept(int nErrorCode) {
// TODO: Add your specialized code here and/or call the base class 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); }
}
// CDataSock member function CDataSock::CDataSock() {
m_pFile=NULL; }
CDataSock::~CDataSock() {
if(NULL!=m_pFile) {
delete m_pFile;
m_pFile=NULL; } }
// Do not edit the following lines, which are needed by ClassWizard. #if 0
BEGIN_MESSAGE_MAP(CDataSock, CAsyncSocket)
//{{AFX_MSG_MAP(CDataSock) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif // 0
///发送数据---只用于上传文件/////////// void CDataSock::OnSend(int nErrorCode) {
// TODO: Add your specialized code here and/or call the base class int readlen, sendlen; int bufferlen = 4096; CString strBuffer; ///初始化缓冲区 char *pBuffer =
strBuffer.GetBuffer(bufferlen); ///为套接字请求事件通知
AsyncSelect(FD_WRITE | FD_CLOSE); ///循环发送直至文件内容发送完毕 while (1) {
///从文件中读取bufferlen个字节内
容,readlen为实际读出的字节数
if ( (readlen =
m_pFile->Read(pBuffer, bufferlen)) > 0 )
{
//将读出数据发送,sendlen为实
际发送字节
if ((SOCKET_ERROR != (sendlen = Send(pBuffer, readlen))) && (0 != sendlen)) {
//根据发送字节数,定位文件
指针位置,如果文件发送完毕,则推出循环
if
((int)m_pFile->GetLength() == m_pFile->Seek(sendlen - readlen, CFile::current)) break;
}
//如果发送失败,则文件指针退回
原来位置,以便以后重新发送 else{
m_pFile->Seek(-readlen,
CFile::current); return;
}
}
//如果读文件失败,则退出 else
break;
} }
///接收数据---文件目录列表,或者下载文件///////////
void CDataSock::OnReceive(int nErrorCode) {
// TODO: Add your specialized code here and/or call the base class CString strBuffer; int nReceive; int n = 4096; ///初始化缓冲区
char *pBuffer = strBuffer.GetBuffer(n); //接收服务器文件目录列表信息 if(transfortype==1) {
//循环读取数据,直至结束
while (SOCKET_ERROR !=
( n=Receive(pBuffer, n-1))) { pBuffer[n] = '\0';
////将新接受到的数据添加至字
符串 m_ReceiveBuffer += pBuffer;
////函数调用----将文件目录信息显示
ListFileInDlg();
}
}
//下载服务器上文件 if(transfortype==2) {
//循环接收数据,并写入本地文件 while ((SOCKET_ERROR != (nReceive
= Receive(pBuffer, n))) && (0 != nReceive))
m_pFile->Write(pBuffer,
nReceive); } }
///将接收到的文件目录信息内容显示出来//// void CDataSock::ListFileInDlg() {
CString filebuffer;
CString name,length,time,attribute; int index=0; CListCtrl *m_list; m_list=(CListCtrl
*)m_dlg->GetDlgItem(IDC_LIST1); ///循环,直到信息字符串为空///// while (!m_ReceiveBuffer.IsEmpty()){ CString s; int n;
///查找一条文件信息的结束\r\n //如果没有
if ( (n = m_ReceiveBuffer.Find("\r\n")) == -1)
break; //找到一条信息 else{
///取出文件名或目录名部分
filebuffer =
m_ReceiveBuffer.Left(n + 2); ///将取出的信息从字符串中去掉
m_ReceiveBuffer =
m_ReceiveBuffer.Right(m_ReceiveBuffer.GetLength() - (n + 2)); name =
filebuffer.Right(filebuffer.GetLength()-
60); length=filebuffer.Mid(29,16); time=filebuffer.Mid(45,15); attribute=filebuffer.Left(10); //目录
if(attribute[0]=='d')
m_list->InsertItem(index,name,1);
else
m_list->InsertItem(index,name,0); m_list->SetItemText(index,1,length);
m_list->SetItemText(index,2,time);
m_list->SetItemText(index,3,attribute); } }
}
CFtp::CFtp(CFtpClientDlg *p_dlg) {
m_dlg = p_dlg;
m_ctrlSock=new CContrlSock();
m_ctrlSock->m_dlg=p_dlg;
m_listSock=NULL;
m_dataSock=NULL;
transfortype=0;
}
CFtp::~CFtp()
{
if(m_ctrlSock!=NULL){
delete m_ctrlSock;
m_ctrlSock=NULL; }
if(m_listSock!=NULL){
delete m_listSock;
m_listSock=NULL;
}
if(m_dataSock!=NULL){
delete m_dataSock;
m_dataSock=NULL; } }
void CFtp::List() { }
/////////连接服务器
void CFtp::ConnectServer(CString servname,int nport,CString usr,CString passwd) {
CString buffer; CListCtrl *m_list; m_list=(CListCtrl
*)m_dlg->GetDlgItem(IDC_LIST1);
m_list->DeleteAllItems();
////初始化控制连接套接字////
//创建套接字//
m_ctrlSock->Create();
//连接指定的FTP服务器/////
m_ctrlSock->Connect(servname,nport);
////格式化USR命令////
buffer = "USER " + usr + "\r\n";
///将USR命令加入命令链表//
m_ctrlSock->m_SendBuffer.AddTail(buffer); ////格式化PASS命令////
buffer = "PASS " + passwd + "\r\n"; ///将PASS命令加入命令链表//
m_ctrlSock->m_SendBuffer.AddTail(buffer);
//向服务器发送命令///// m_ctrlSock->sendcmd(); //////初始化数据传送套接字 if (NULL != m_dataSock) { delete m_dataSock;
m_dataSock = NULL;
}
m_dataSock = new CDataSock(); m_dataSock->m_dlg = m_dlg; if (NULL != m_listSock) {
delete m_listSock; m_listSock=NULL; }
///创建监听套接字准备接收来自服务器的文件目录信息//
m_listSock = new CListenSock(); m_listSock->Create(); m_listSock->Listen();
///声明地址变量,用于后面得到监听套接字的Ip地址和端口////
SOCKADDR_IN listing_address, control_address; int addr_size;
////得到系统分配的客户端监听套接字Ip地址和端口////
addr_size = sizeof(listing_address); m_listSock->GetSockName((SOCKADDR *)&listing_address, &addr_size); m_ctrlSock->GetSockName((SOCKADDR *)&control_address, &addr_size); /////取出Ip地址和端口///////////// unsigned char *port = (unsigned char
*)&(listing_address.sin_port);
unsigned char *host = (unsigned char *)&(control_address.sin_addr);
///将Ip地址和端口放入命令字符串//// buffer.Format("PORT %i,%i,%i,%i,%i,%i\r\n",
(int)host[0], (int)host[1],
(int)host[2], (int)host[3],
(int)port[0], (int)port[1]);
////将PORT命令加入命令链表,使服务器反向连接客户端////
m_ctrlSock->m_SendBuffer.AddTail(buffer);
///////默认,以文本方式传输////////////
m_ctrlSock->m_SendBuffer.AddTail("TYPE A\r\n");
/////标志位信息/////////// transfortype=1;
////将LIST命令加入命令链表,使服务器发送其上的目录文件信息///
m_ctrlSock->m_SendBuffer.AddTail("LIST\r\n");
//向服务器发送命令 m_ctrlSock->sendcmd(); }
/////// 该函数用于向服务器上载文件 void CFtp::put(CString
m_localfile,CString m_remotefile,bool binary) {
CString buffer, strCommand; CString strSelectedLine; //////初始化数据传送套接字 if (NULL != m_dataSock)
{ delete m_dataSock; m_dataSock = NULL;
}
m_dataSock = new CDataSock();
if (NULL != m_listSock) {
delete m_listSock; m_listSock=NULL; }
///创建监听套接字准备接收来自服务器的连接请求//
m_listSock = new CListenSock(); m_listSock->Create(); m_listSock->Listen();
///声明地址变量,用于后面得到监听套接字的Ip地址和端口////
SOCKADDR_IN listing_address, control_address; int addr_size;
////得到系统分配的客户端监听套接字Ip地址和端口////
addr_size = sizeof(listing_address); m_listSock->GetSockName((SOCKADDR *)&listing_address, &addr_size); m_ctrlSock->GetSockName((SOCKADDR *)&control_address, &addr_size);
/////取出Ip地址和端口/////////////
unsigned char *port = (unsigned char *)&(listing_address.sin_port);
unsigned char *host = (unsigned char *)&(control_address.sin_addr);
///将Ip地址和端口放入命令字符串////
buffer.Format("PORT %i,%i,%i,%i,%i,%i\r\n",
(int)host[0], (int)host[1],
(int)host[2], (int)host[3],
(int)port[0], (int)port[1]);
////将PORT命令加入命令链表,使服务器反向连接客户端////
m_ctrlSock->m_SendBuffer.AddTail(buffe
r);
///发送命令
m_ctrlSock->sendcmd(); /////标志位信息/////////// transfortype=3;
////初始化数据传输套接字的文件变量//////
if (NULL != m_dataSock->m_pFile) {
delete m_dataSock->m_pFile; m_dataSock->m_pFile=NULL; }
///如果以二进制方式传输//// if (binary) {
////向服务器发送TYPE I命令,指定以
二进制方式传输文件//
m_ctrlSock->m_SendBuffer.AddTail("TYPE
I\r\n");
///以读方式打开要上传的本地二进制文件////
m_dataSock->m_pFile = new
CFile(m_localfile,
CFile::modeRead |
CFile::typeBinary);
}
///否则以文本方式传输////
else
{
////向服务器发送TYPE A命令,指定以
文本方式传输文件//
m_ctrlSock->m_SendBuffer.AddTail("TYPE
A\r\n");
///以读方式打开要上传的本地文本文件////
m_dataSock->m_pFile = new
CStdioFile(m_localfile,
CFile::modeRead |
CFile::typeText); }
////将STOR命令加入命令链表,通知服务器要上传文件////
// m_remotefile为上传至服务器后的文件名//
strCommand = "STOR " + m_remotefile + "\r\n";
m_ctrlSock->m_SendBuffer.AddTail(strCommand);
//发送命令
m_ctrlSock->sendcmd(); }
/////// 该函数用于从服务器下载文件
void CFtp::get(CString m_localfile,CString m_remotefile,bool binary) {
CString buffer, strCommand;
CString strSelectedLine; //////初始化数据传送套接字 if (NULL != m_dataSock) { delete m_dataSock;
m_dataSock = NULL;
}
m_dataSock = new CDataSock(); if (NULL != m_listSock) {
delete m_listSock;
m_listSock=NULL; }
///创建监听套接字准备接收来自服务器的数据//
m_listSock = new CListenSock(); //创建
m_listSock->Create(); //监听
m_listSock->Listen();
///声明地址变量,用于后面得到监听套接字的Ip地址和端口////
SOCKADDR_IN listing_address, control_address; int addr_size;
////得到系统分配的客户端监听套接字Ip地址和端口////
addr_size = sizeof(listing_address);
m_listSock->GetSockName((SOCKADDR
*)&listing_address, &addr_size); m_ctrlSock->GetSockName((SOCKADDR *)&control_address, &addr_size); /////取出Ip地址和端口/////////////
unsigned char *port = (unsigned char
*)&(listing_address.sin_port);
unsigned char *host = (unsigned char *)&(control_address.sin_addr);
///将Ip地址和端口放入命令字符串//// buffer.Format("PORT %i,%i,%i,%i,%i,%i\r\n",
(int)host[0], (int)host[1],
(int)host[2], (int)host[3],
(int)port[0], (int)port[1]);
////将PORT命令加入命令链表,使服务器反向连接客户端////
m_ctrlSock->m_SendBuffer.AddTail(buffer);
//向服务器发送命令
m_ctrlSock->sendcmd(); /////标志位信息/////////// transfortype=2;
////初始化数据传输套接字的文件变量 if (NULL != m_dataSock->m_pFile) {
delete m_dataSock->m_pFile; m_dataSock->m_pFile=NULL; }
///如果以二进制方式传输//// if (binary) {
////向服务器发送TYPE I命令,指定以
二进制方式传输文件//
m_ctrlSock->m_SendBuffer.AddTail("TYPE I\r\n"); ///以写方式打开或创建本地二进制文
件////
m_dataSock->m_pFile = new CFile(m_localfile,
CFile::modeWrite |
CFile::typeBinary | CFile::modeCreate); }
///否则以文本方式传输//// else {
////向服务器发送TYPE A命令,指定以
文本方式传输文件//
m_ctrlSock->m_SendBuffer.AddTail("TYPE A\r\n");
///以写方式打开或创建本地文本文件////
m_dataSock->m_pFile = new
CStdioFile(m_localfile,
CFile::modeWrite |
CFile::typeText | CFile::modeCreate); }
////将RETR命令加入命令链表,通知服务器要下载文件////
// m_remotefile为要下载的服务器上的文件名//
strCommand = "RETR " + m_remotefile + "\r\n";
m_ctrlSock->m_SendBuffer.AddTail(strCommand);
//发送命令
m_ctrlSock->sendcmd(); }
void CFtp::ChangeDirDown(CString dir)
{
CString buffer; CListCtrl *m_list; m_list=(CListCtrl
*)m_dlg->GetDlgItem(IDC_LIST1); m_list->DeleteAllItems(); //将CWD命令加入命令链表
m_ctrlSock->m_SendBuffer.AddTail("CWD " + dir + "\r\n");
//////初始化数据传送套接字 if (NULL != m_dataSock) {
delete m_dataSock; m_dataSock = NULL;
}
m_dataSock = new CDataSock(); if (NULL != m_listSock) {
delete m_listSock;
m_listSock=NULL; }
///创建监听套接字准备接收来自服务器的文件目录信息//
m_listSock = new CListenSock(); m_listSock->Create(); m_listSock->Listen();
///声明地址变量,用于后面得到监听套接字的Ip地址和端口////
SOCKADDR_IN listing_address, control_address;
int addr_size;
////得到系统分配的客户端监听套接字Ip地址和端口////
addr_size = sizeof(listing_address); m_listSock->GetSockName((SOCKADDR *)&listing_address, &addr_size); m_ctrlSock->GetSockName((SOCKADDR *)&control_address, &addr_size); /////取出Ip地址和端口///////////// unsigned char *port = (unsigned char *)&(listing_address.sin_port);
unsigned char *host = (unsigned char *)&(control_address.sin_addr);
///将Ip地址和端口放入命令字符串//// buffer.Format("PORT %i,%i,%i,%i,%i,%i\r\n",
(int)host[0], (int)host[1],
(int)host[2], (int)host[3],
(int)port[0], (int)port[1]);
////将PORT命令加入命令链表,使服务器反向连接客户端////
m_ctrlSock->m_SendBuffer.AddTail(buffer);
///////默认,以文本方式传输////////////
m_ctrlSock->m_SendBuffer.AddTail("TYPE
A\r\n");
/////标志位信息/////////// transfortype=1;
//将LIST命令加入命令链表,获取服务器文
件目录列表
m_ctrlSock->m_SendBuffer.AddTail("LIST\r\n");
m_ctrlSock->sendcmd(); }
void CFtp::ChangeDirUp() {
CString buffer;
CListCtrl *m_list; m_list=(CListCtrl
*)m_dlg->GetDlgItem(IDC_LIST1); m_list->DeleteAllItems(); //将CWD命令加入命令链表
m_ctrlSock->m_SendBuffer.AddTail("CDUP\r\n");
//////初始化数据传送套接字 if (NULL != m_dataSock) { delete m_dataSock; m_dataSock = NULL;
}
m_dataSock = new CDataSock();
if (NULL != m_listSock) {
delete m_listSock; m_listSock=NULL; }
///创建监听套接字准备接收来自服务器的文件目录信息//
m_listSock = new CListenSock();
m_listSock->Create(); m_listSock->Listen();
///声明地址变量,用于后面得到监听套接字的Ip地址和端口////
SOCKADDR_IN listing_address, control_address;
int addr_size;
////得到系统分配的客户端监听套接字Ip地址和端口////
addr_size = sizeof(listing_address); m_listSock->GetSockName((SOCKADDR *)&listing_address, &addr_size);
m_ctrlSock->GetSockName((SOCKADDR *)&control_address, &addr_size); /////取出Ip地址和端口/////////////
unsigned char *port = (unsigned char *)&(listing_address.sin_port);
unsigned char *host = (unsigned char *)&(control_address.sin_addr);
///将Ip地址和端口放入命令字符串//// buffer.Format("PORT %i,%i,%i,%i,%i,%i\r\n",
(int)host[0], (int)host[1],
(int)host[2], (int)host[3],
(int)port[0], (int)port[1]);
////将PORT命令加入命令链表,使服务器反向连接客户端////
m_ctrlSock->m_SendBuffer.AddTail(buffer);
///////默认,以文本方式传输////////////
m_ctrlSock->m_SendBuffer.AddTail("TYPE A\r\n");
/////标志位信息/////////// transfortype=1;
//将LIST命令加入命令链表,获取服务器文
件目录列表
m_ctrlSock->m_SendBuffer.AddTail("LIST\r\n");
m_ctrlSock->sendcmd(); }
void CFtpClientDlg::OnClickList1(NMHDR*
pNMHDR, LRESULT* pResult) { // TODO: Add your control notification
handler code here if(NULL==ftpclient) return;
CListCtrl *m_list=(CListCtrl *)GetDlgItem(IDC_LIST1); int
selitem=m_list->GetSelectionMark(); int select;
CString m1,m2; CEdit *edit;
select=m_list->GetSelectionMark(); m1=m_list->GetItemText(select,0); m2=m_list->GetItemText(select,3); if(m2.GetAt(0)=='d') {
((CButton
*)GetDlgItem(IDC_DIRDOWN))->EnableWindow(tr
ue);
((CButton
*)GetDlgItem(IDC_GET))->EnableWindow(false);
edit=(CEdit
*)GetDlgItem(IDC_LOCAL_FILE);
edit->SetWindowText("");
edit=(CEdit
*)GetDlgItem(IDC_REMOTE_FILE);
edit->SetWindowText("");
} else if(m2.GetAt(0)=='-') {
((CButton
*)GetDlgItem(IDC_DIRDOWN))->EnableWindow(false);
((CButton
*)GetDlgItem(IDC_GET))->EnableWindow(true);
edit=(CEdit
*)GetDlgItem(IDC_LOCAL_FILE); edit->SetWindowText(m1);
edit=(CEdit
*)GetDlgItem(IDC_REMOTE_FILE);
edit->SetWindowText(m1);
} else {
((CButton
*)GetDlgItem(IDC_DIRDOWN))->EnableWindow(false);
((CButton
*)GetDlgItem(IDC_GET))->EnableWindow(false)
;
edit=(CEdit
*)GetDlgItem(IDC_LOCAL_FILE);
edit->SetWindowText("");
edit=(CEdit
*)GetDlgItem(IDC_REMOTE_FILE);
edit->SetWindowText("");
*pResult = 0; }
void CFtpClientDlg::OnDblclkList1(NMHDR*
pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification
handler code here *pResult = 0; }
void CFtpClientDlg::OnConnect() {
// TODO: Add your control notification handler code here
CString server,usr,pass; if(NULL!=ftpclient) {
delete ftpclient; ftpclient=NULL; }
ftpclient=new CFtp(this); CEdit *edit; edit=(CEdit
*)GetDlgItem(IDC_SERVER_NAME); edit->GetWindowText(server); edit=(CEdit *)GetDlgItem(IDC_USR); edit->GetWindowText(usr);
edit=(CEdit *)GetDlgItem(IDC_PASS); edit->GetWindowText(pass);
ftpclient->ConnectServer(server,21,usr,pass);
}
void CFtpClientDlg::OnDisconnect() {
// TODO: Add your control notification handler code here if(NULL!=ftpclient) {
delete ftpclient; ftpclient=NULL; }
((CButton
*)GetDlgItem(IDC_CONNECT))->EnableWindow(true);
((CButton
*)GetDlgItem(IDC_DISCONNECT))->EnableWindow(false); ((CButton
*)GetDlgItem(IDC_DIRUP))->EnableWindow(false);
((CButton
*)GetDlgItem(IDC_PUT))->EnableWindow(false);
((CButton
*)GetDlgItem(IDC_DIRDOWN))->EnableWindow(false);
((CButton
*)GetDlgItem(IDC_DIRUP))->EnableWindow(false); }
void CFtpClientDlg::OnDirup() {
// TODO: Add your control notification handler code here
if(NULL!=ftpclient)
ftpclient->ChangeDirUp();
}
void CFtpClientDlg::OnDirdown() {
// TODO: Add your control notification handler code here if(NULL==ftpclient) return;
CListCtrl *m_list=(CListCtrl *)GetDlgItem(IDC_LIST1); CString m1,m2;
int select=m_list->GetSelectionMark(); m1=m_list->GetItemText(select,0); m2=m_list->GetItemText(select,3); if(m2[0]!='d') return;
ftpclient->ChangeDirDown(m1); }
void CFtpClientDlg::OnGet() {
// TODO: Add your control notification handler code here if(NULL==ftpclient) return;
bool binary;
CString m_local,m_remote; if(((CButton
*)GetDlgItem(IDC_CHECK1))->GetCheck()==BST_CHECKED)
binary=true;
else
binary=false;
CEdit *edit;
edit=(CEdit
*)GetDlgItem(IDC_LOCAL_FILE); edit->GetWindowText(m_local);
edit=(CEdit
*)GetDlgItem(IDC_REMOTE_FILE); edit->GetWindowText(m_remote);
if(m_local=="" || m_remote=="")
ftpclient->get(m_local,m_remote,binary); }
void CFtpClientDlg::OnPut() {
// TODO: Add your control notification handler code here
return;
if(m_local=="" || m_remote=="")
ftpclient->put(m_local,m_remote,binary); }
return;
if(NULL==ftpclient) return;
bool binary;
CString m_local,m_remote;
if(((CButton
*)GetDlgItem(IDC_CHECK1))->GetCheck()==BST_CHECKED)
binary=true;
else
binary=false;
CEdit *edit; edit=(CEdit
*)GetDlgItem(IDC_LOCAL_FILE); edit->GetWindowText(m_local); edit=(CEdit
*)GetDlgItem(IDC_REMOTE_FILE); edit->GetWindowText(m_remote);
运行界面如下: