课程设计封面.docx
- 文档编号:23430003
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:15
- 大小:21.97KB
课程设计封面.docx
《课程设计封面.docx》由会员分享,可在线阅读,更多相关《课程设计封面.docx(15页珍藏版)》请在冰豆网上搜索。
课程设计封面
广西科技大学鹿山学院
实训报告
2015-2016学年第2学期
课程名称:
计算机网络
设计名称:
计算机网络实训
系别:
电气与计算机工程系
专业班级:
计软141班
姓名:
李振华
学号:
20141377
指导教师:
评阅成绩:
评阅人:
二〇一六年三月三十日
电气与计算机工程系实践教学管理中心
目录1
一、任务书2
二、算法思路2
2.1Scoket套接字算法2
2.2FTP浏览器算法3
2.3P2P网络播放器算法4
2.4Q版聊天软件算法4
三、算法心得5
3.1Scoket套接字编程5
3.2FTP浏览器编程5
3.3P2P网络播放器算法6
3.4聊天软件编程6
四、课程设计总结7
五、系统部分代码9
5.1FTP浏览器9
5.2Socket套接字................................................9
二、算法思路
2.1Scoket套接字编程算法
套接字是一种双向的通信端口。
位于网络中的主机通过连接的套接字提供的接口进行数据传输。
套接字是一种使用标准UNIX文件描述符(filedescriptor)与其他程序通信的方式。
套接字可以看作是处于不同主机之间的两个程序的通信连接端点。
一方面程序将要传输的信息写入套接字中,而另一方面则通过读取套接字内的数据来获得传输的信息。
假设存在两台主机A与B,在主机A中存在进程C,主机B中存在进程D,当进程C需要将数据送到进程D时,首先将数据写到套接字中,而进程D可以通过读取套接字来获得进程C发送的信息。
在网络中,不同计算机是通过IP地址来区分的,也就是说,要将数据由主机A发送到主机B,只要知道主机B的IP地址就可以确定数据要发送的目的地。
但是,在主机A与B中不可能只有进程C和进程D两个进程。
主机B在收到主机A发送来的数据后,如何才能确定该数据是发送给进程D?
因此,还需要某种标识信息,用于描述网络通信数据发往的进程。
TCP/IP协议提出了协议端口的概念,用于标识通信的进程。
2.2FTP浏览器编程算法
一个完整的FTP文件传输需要建立两种类型的连接:
一种为文件传输命令,称为控制连接;另一种实现真正的文件传输,称为数据连接。
(1)控制连接。
客户端希望与FTP服务器端建立上传下载的数据传输时,它首先向服务器的TCP21端口发起一个建立连接的请求,FTP服务器接收来自客户端的请求,完成连接的建立过程。
(2)数据连接。
FTP控制连接建立后,即可开始传输文件,传输文件的连接称为FTP数据连接。
FTP数据连接就是FTP传输数据的过程,它有主动传输模式(ACTIVE)和被动传输模式(PASSIVE)两种模式。
主动传输模式下,FTP服务器使用20端口与客户端的暂时端口进行连接,并传输数据,客户端只是处于接收状态。
被动传输模式下,FTP服务器打开一个暂态端口等待客户端对其进行连接,并传输数据,服务器端并不参与数据的主动传输,只是被动接收。
2.3P2P网络播放器编程算法
基于P2P的视频播放器,本地端在发现对等方网络位置后,依据网络位置生成网络的拓扑,将其余对等端和资源状况作为权值。
从本地节点出发寻找一个经过所有资源节点的最小生成树构成最短下载路径。
依次遍历各个资源节点,告知自身所需下载的资源名称,而在远程节点收到信息后,即根据既定的规则将文件划分为数个分块。
每个节点只需要传输相应分块即可。
文件采用HTTP的多线程下载技术,同时开启多个线程进行文件下载,加快下载速度。
2.4Q版聊天软件编程
使用Java中的Swing来进行操作界面的开发。
利用java中的Socket(套接字)来完成客户端与服务器的交互。
该Socket是基于TCP/IP通信协议的数据传输对象,它提供了安全可靠的通信机制。
在服务器使用ServerSocket创建监听端口,而在客户端则使用Socket来连接服务器。
在连接成功时,应用程序的客户端和服务器都将产生一个Socket实例,本聊天程序就是通过利用这个Socket实例来实现两段的通信和其他功能。
在通信的过程中我也使用了多线程编程技术以实现复杂的交互行为。
尤其是在服务器端,服务器每接收一个客户端就会产生一个虚拟服务器来单独为其服务。
通过该技术的运用使得本聊天软件可以允许多人同时在线与自己的好友畅怀的交流。
客户端:
用户在客户端的所有操作都依赖于客户端的守护线程Client来完成,该线程负责与服务器进行数据交互。
当用户需要登录时,由登录模块调用Client向服务器发送身份验证请求。
服务器接收到该验证请求之后便进行验证处理并返回验证结果给Client。
如果Client判定验证成功则从验证结果中提取出个人信息并开启好友模块;当用户在好友模块中打开了一个聊天模块后,便可以调用Client来进行聊天消息的传递。
服务器:
服务器分为主服务器与虚拟服务器。
主服务器Server作为服务器的守护线程,主要负责接收客户端的连接,在服务器接收到一个客户端后,就开启一个虚拟服务器VirtualServer来为该用户服务;虚拟服务器通过调用底层的登录模块等来为用户提供登录验证等服务。
三、算法心得
3.1Scoket套接字编程
刚开始拿到实训的安排表的时候,对Socket套接字编程不是很理解,很懂,就去看实训用的教程,了解到了TCP套接字的传输原理以及方法。
在编写程序时,还是遇到了一定的困难,而且一定要综合考虑各方面的问题,不光是把代码写好就可以,重要的是理解。
经过看书,问同学,上网查阅,套接字的实训告一段落。
不管怎么说,套接字的小实训给我带来了很大的收获。
3.2FTP浏览器编程
FTP服务器的默认端口为21,若不是使用的默认端口,在访问时就必须加上端口号;如果多个网站在同一台主机上,且每个网站的服务单独运行,则这多个网站的服务端口不能相同;也可以在一个网站下为其它每一个网站建立一个虚拟目录,通过虚拟目录访问不同的网站,这也能实现同一台主机架设多个的网站的目的。
FTP是TCP/IP的一种具体应用,其工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程。
这样的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。
采用FTP协议可使互联网用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。
以达到资源共享和传递信息的目的。
由于FTP的使用使得互联网上出现了大量为用户提供下载服务的服务器。
其中,FTP在文件传输中还支持断点续传功能,可以大幅度地减小CPU和网络带宽的开销。
第二阶段的编程开始后,发现自己比上一阶段的套接字还要迷茫,感觉无从下手,有很大的困难。
但是就算不会做,也不能不做,所以就上网参考了前辈们的经验,逐渐的开明起来,发现这个并不是有那么难。
在同学不断地帮助下,完成了FTP浏览器的实训。
3.3P2P网络播放器编程
P2P视频系统的核心关键技术是网络拓扑结构的设计和数据调度算法的设计,以满足更高的用户需求。
当自己做出来的和别人做的有很大的差距,给我这个初学者一个很大的打击,发现自己的这个有很多的问题,有时候能运行出来,有时候就不可以,反正不是一个很成功的一个实训。
在以后的学习生活中,要完善这个实训,让它更好,更快,更强。
3.4Q版聊天软件编程
该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。
当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。
对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。
首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。
而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。
四、课程设计总结
为期三周的实训结束了,从理论到实践,我们都一路走了过来。
有迷茫,也有充满希望的时候,就像一句古诗词一样“山重水复疑无路,柳暗花明又一村。
”在刚开始的时候,真的是无从下手,不知道该从哪里开始做起,经过两天的沉淀,开始拿起了课本,根据课本上面的指导,开始了这艰难的第一步,第一部分的实训快结束时,要开始测试自己的作品了,有很多不足的地方,但是却给了我很大的希望,因为我成功的迈出了这第一步,在经过同学的帮助下,后面的实训也是顺风顺水,在结束的时候,已经有了一点小的成品。
三周的实训,给我带来了很大的收获,不仅仅是学习上的,还有精神层面上的。
平时上课都是理论化的知识,现在上机操作和想象中完全不一样,突然会发现自己想的和上机做出来的完全不一样,自己独立完成还是有一定困难的,尤其是当进行到下一步的时候,那种困惑,那种烦躁的心情,需要来克服。
我们要有一种迎难而上的精神。
现在实训结束了,我自己也得到了锻炼。
从一无所知到现在有了很大的进步,当然,也还存在着不足,实训培养了我的独立思考能力,分析问题的能力等等的能力。
在不断地提高我自己,我也会针对自己的不足进行提高,对自己薄弱的环节进行针对性训练。
我已经在开始看教学视频,并且在即将来临的暑假中,充分利用好时间,效率最大化。
系统部分代码
FTP浏览器:
packageftpDemo;
importjava.io.DataOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
import.TelnetInputStream;
import.TelnetOutputStream;
import.ftp.FtpClient;
publicclassftpUtil{
//上传文件至FTP通用方法
publicstaticvoidupLoadFileFtp(KmConfigkmConfig,InputStreamis,StringfileName){
try{
StringftpHost=kmConfig.getFtpHost();
intport=kmConfig.getFtpPort();
StringuserName=kmConfig.getFtpUser();
StringpassWord=kmConfig.getFtpPassword();
Stringpath=kmConfig.getFtpPath();
FtpClientftpClient=newFtpClient(ftpHost,port);//ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
ftpClient.login(userName,passWord);//userName、passWord分别为FTP服务器的登陆用户名和密码
ftpClient.binary();
ftpClient.cd(path);//path为FTP服务器上保存上传文件的路径。
TelnetOutputStreamtelnetOut=ftpClient.put(fileName);//fileName为上传的文件名
DataOutputStreamdataOut=newDataOutputStream(telnetOut);
bytebuffer[]=newbyte[*];
intcount=;
while((count=is.read(buffer))!
=-){
dataOut.write(buffer,,count);
}
telnetOut.close();
dataOut.close();
ftpClient.closeServer();
}catch(Exceptione){
System.out.println("上传文件失败!
请检查系统FTP设置,并确认FTP服务启动");
}
}
//删除文件至FTP通用方法
publicstaticvoiddeleteFileFtp(KmConfigkmConfig,StringfileName){
try{
StringftpHost=kmConfig.getFtpHost();
intport=kmConfig.getFtpPort();
StringuserName=kmConfig.getFtpUser();
StringpassWord=kmConfig.getFtpPassword();
Stringpath=kmConfig.getFtpPath();
FtpClientftpClient=newFtpClient(ftpHost,port);//ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
ftpClient.login(userName,passWord);//userName、passWord分别为FTP服务器的登陆用户名和密码
ftpClient.binary();
ftpClient.cd(path);//path为FTP服务器上保存上传文件的路径。
try{
ftpClient.sendServer("dele"+fileName+"\r\n");
}catch(Exceptione){
System.out.println("删除文件失败!
请检查系统FTP设置,并确认FTP服务启动");
}
ftpClient.closeServer();
}catch(Exceptione){
System.out.println("删除文件失败!
");
}
}
//下载ftp文件
publicstaticvoiddownloadFileFtp(KmConfigkmConfig,StringfileName,StringclientFileName,OutputStreamoutputStream){
try{
StringftpHost=kmConfig.getFtpHost();
intport=kmConfig.getFtpPort();
StringuserName=kmConfig.getFtpUser();
StringpassWord=kmConfig.getFtpPassword();
Stringpath=kmConfig.getFtpPath();
FtpClientftpClient=newFtpClient(ftpHost,port);//ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
ftpClient.login(userName,passWord);//userName、passWord分别为FTP服务器的登陆用户名和密码
ftpClient.binary();
ftpClient.cd(path);//path为FTP服务器上保存上传文件的路径。
try{
TelnetInputStreamin=ftpClient.get(fileName);
byte[]bytes=newbyte[];
intcnt=;
while((cnt=in.read(bytes,,bytes.length))!
=-){
outputStream.write(bytes,,cnt);
}
outputStream.close();
in.close();
}catch(Exceptione){
ftpClient.closeServer();
e.printStackTrace();
}
ftpClient.closeServer();
}catch(Exceptione){
System.out.println("下载文件失败!
请检查系统FTP设置,并确认FTP服务启动");
}
}
//在ftp服务器上传件文件夹
publicbooleancreateDir(Stringpath,FtpClientftpClient)throwsException{
//进入到home文件夹下
ftpClient.cd("/home");
//创建远程文件夹
//远程命令包括
//USERPORTRETRALLODELESITEXMKDCDUPFEAT
//PASSPASVSTORRESTCWDSTATRMDXCUPOPTS
//ACCTTYPEAPPERNFRXCWDHELPXRMDSTOUAUTH
//REINSTRUSMNTRNTOLISTNOOPPWDSIZEPBSZ
//QUITMODESYSTABORNLSTMKDXPWDMDTMPROT
//在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上/r/n
//ftpclient.sendServer("XMKD/test/bb/r/n");//执行服务器上的FTP命令
//ftpclient.readServerResponse一定要在sendServer后调用
//nameList("/test")获取指目录下的文件列表
//XMKD建立目录,当目录存在的情况下再次创建目录时报错
//XRMD删除目录
//DELE删除文件
//通过远程命令穿件一个files文件夹
ftpClient.sendServer("MKD"+path+"\r\n");
//这个方法必须在这两个方法中间调用否则命令不管用
ftpClient.binary();
ftpClient.readServerResponse();
returnfalse;
}
/**
*检查文件夹是否存在
*@paramdir
*@paramftpClient
*@return
*/
publicbooleanisDirExist(Stringdir,FtpClientftpClient){
try{
ftpClient.cd(dir);
}catch(Exceptione){
returnfalse;
}
returntrue;
}
}
Socket套接字
服务器端:
importjava.io.*;
import.*;
publicclassServer{
publicstaticvoidmain(String[]args){
try{
System.out.println("等待连接");
//创建服务器套接字,端口号5500必须与客户端一致
ServerSocketserverSocket=newServerSocket(5500);
//侦听来自客户端的连接请求
SocketconnectToClient=serverSocket.accept();
System.out.println("连接请求来自"+connectToClient.getInetAddress().getHostAddress());//连接远程主机的地址
DataInputStreaminFromClient=newDataInputStream(connectToClient.getInputStream());
//DataInputStream有更方便的方法来处理信息
DataOutputStreamoutToClient=newDataOutputStream(connectToClient.getOutputStream());
Stringstr;
doubleradius,area;
booleangoon=true;
while(goon){
//从socket中读取数据
str=inFromClient.readUTF();
if(!
str.equals("bye")){
radius=Double.parseDouble(str);
System.out.println("接收到的半径为:
"+radius);
area=radius*radius*Math.PI;
str=Double.toString(area);
//向socket中写字
outToClient.writeUTF(str);
outToClient.flush();
System.out.println("圆面积"+str+"已发送");
}else{
goon=false;
outToClient.writeUTF("bye");
outToClient.flush();
}
}
inFromClient.close();
outToClient.close();
serverSocket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
客户端:
//-------------文件名Client.Java----------------//
//这是客户端程序
importjava.io.*;
import.*;
publicclassClient{
publicstaticvoidmain(String[]args){
try{
//连接本机,端口号5500
SocketconnectToServer=newSocket("localhost",5500);
//将数据输入流连接到socket上
DataInputStreaminFromServer=newDataInputStream(
connectToServer.getInputStream());
//将数据输出流连接到socket上
DataOutputStreamoutToserver=newD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 封面