Java实验の实现FTP功能

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java 程序设计实验报告
实验名称:__ _实现FTP功能 ____
实验日期: 2009年 11月 24日
报告日期: 2009年 12月 1日
成绩:______
一、实验内容
1、熟悉java中网络编程的方法;
2、复习图形用户界面的设计方法;
3 、复习事件监听器的使用;
4 、复习输入、输出流的创建和封装方法;
二、实验过程
1、实验要求
按要求设计图形用户界面,编写实现类似于 FTP 功能的程序。

在界面的TextField 中输入一个网址,点击“链接”按钮时,客户端与服务器建立连接,点击“断开”按钮时链接断开。

当点击“发送请求”按钮时,向服务器发送字符串“ls”,服务器将特定目录下的文件名发送到客户端,并在 TextArea 中显示,然后客户端根据接收到的文件名,在TestField 中输入文件名,然后点击“下载文件”按钮,从服务器端下载指定的文件,并保存在指定目录的文件中。

2、实验分析
该程序在客户端继承了Applet类来实现图形用户界面,在布局上利用了 Panel 面板,为面板对象创建了 FlowLayout 流式对象,为Applet 创建了BorderLayout 布局,将各个控件添加到面板上,并为按钮控件添加事件监听器,响应按钮点击事件。

在服务器端,首先创建了一个 ServerSocket 对象,然后通过其对象调用accept()方法,返回一个 Socket 对象,于是服务器处于监听状态。

在客户端,当点击“连接”按钮时,由类 TextField 的方法 getText()获得输入的 IP地址,然后根据输入的 IP 创建 Socket 对象。

当点击“断开”按钮时,调用 Socket 类中的close()方法,关闭套接字。

当点击“发送请求”按钮时,通过套接字的对象调用 getInputStream()方法和 getOutputStream()方法,获得输入、输出流,并对流进行包装,然后利用输出流向服务器发送字符串“ls”。

当服务器接收到“ls”字符串时,就在当前内目录下创建文件对象,并利用文件类中的 list()方法获得当前目录下的文件名,并将获得的文件名发送到客户端,客户端在接收到文件名时,就将文件名追加到 TextArea 的末尾。

然后从键盘输入要下载的文件名,点击“下载文件”按钮,将输入的文件名发送到服务器。

当服务器接收到要下载的文件名时,通过创建文件流对象,将文件的内容发生到客户端。

客户端首先创建一个文件对象,和文件输入流,将读取到的文件保存起来。

当读取完毕后关闭流对象。

3、实验核心代码分析:
客户端核心代码:
import java.awt.event.*;
import java.awt.*;
import .Socket;
import java.io.*;
public class FTP_13 extends java.applet.Applet implements ActionListener{ //继承Applet类,实现图形用户界面
Label server = new Label("输入服务器IP:");
TextField IP = new TextField("127.0.0.1",30);
Button link = new Button("连接");
Button down = new Button("断开");
Button requst = new Button("发送请求");
Button load = new Button("下载文件");
TextArea filelist = new TextArea();
TextField inputfile = new TextField(50);
Panel pal1,pal2,pal3;
FlowLayout flo;
//设计图形用户界面
public void init() {
setLayout(new BorderLayout(100,100));
pal1 = new Panel(); pal2 = new Panel();
pal3 = new Panel(); flo = new FlowLayout();
//创建了三个Panel 面板和一个流式布局
pal1.setLayout(flo); pal2.setLayout(flo);
pal3.setLayout(flo); pal1.add(server);
pal1.add(IP); pal1.add(link);
pal1.add(down); add(pal1,"North");
pal2.add(filelist); pal2.add(requst);
add(pal2,"Center"); pal3.add(inputfile);
pal3.add(load); add(pal3,"South");
link.addActionListener(this); //为按钮注册事件监听器
down.addActionListener(this);
requst.addActionListener(this);
load.addActionListener(this);
}
Socket cs;
String ipadd; String filename; String loadfilename;
public void actionPerformed(ActionEvent e)
{ //事件响应函数try{
if(e.getSource() == link) //点击“连接”按钮时,根据输入
{ ipadd = IP.getText(); // 的IP地址创建套接字Socket
cs = new Socket(ipadd,5678); }
if(e.getSource() == down) //点击“断开”按钮时,关闭套接字
{ cs.close(); }
//点击“连接请求”按钮时,向服务器发送“ls”字符串
if(e.getSource() == requst)
{
//由Socket类中的getOutputStream()方法获得输出流,并对流进行封装 PrintWriter wout = new PrintWriter(cs.getOutputStream());
wout.println("ls"); wout.flush();
//由Socket类中的getInputStream()方法获得输入流,并对流进行封装 BufferedInputStream rin = new BufferedInputStream(cs.getInputStream());
byte[] buffer = new byte[256];
int a = rin.read(buffer,0,256);
while(a != -1)
{
loadfilename = new String(buffer);
loadfilename.trim(); //将byte数组中多余的空格去掉
filelist.append(loadfilename); //将读到的文件名追加到TextArea中
filelist.append("\n");
a = rin.read(buffer,0,256);
}
rin.close(); //关闭流}
//当点击“下载文件”按钮时,将输入的文件从服务器下载到客户端的指定目录的文件中if(e.getSource() == load)
{
//由Socket类中的getOutputStream()方法获得输出流,并对流进行封装OutputStreamWriter wout = new OutputStreamWriter(cs.getOutputStream());
filename = inputfile.getText();
wout.write(filename); //将输入的文件名发送到服务器
//由Socket类中的getInputStream()方法获得输入流,并对流进行封装BufferedReader buf = new BufferedReader(new
InputStreamReader(cs.getInputStream()));
File file = new File("E:\\loadfile.txt"); //将下载的文件保存在 E 盘 //创建文件流对象
FileWriter fileout = new FileWriter(file);
String text; text = buf.readLine();
while(text != null) //从服务器读文件并将文件保存在客户端的指定文件中
{ fileout.write(text);
text = buf.readLine(); }
fileout.close(); }
} catch(IOException ee){ }
} }
服务器端核心代码:
import .*;
import java.io.*;
public class FTP_Server {
public static void main(String[] args) {
ServerSocket s = null;
try {//创建一个ServerSocket在端口5678监听客户请求
s = new ServerSocket(5678);
}catch(IOException e){ }
while(true)
{
try{
Socket cs = s.accept();
//使用accept()阻塞等待客户请求
System.out.println("创建");
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader bufin = new BufferedReader(new
InputStreamReader(cs.getInputStream()));
//由Socket对象得到输出流,并构造BufferedWriter对象
PrintWriter wout = new PrintWriter(cs.getOutputStream());
String str = bufin.readLine(); //读取客户端发来的信息 System.out.println(str);
if(str.equals("ls"))
{
File path = new File(".");
//在当前目录下创建 File 对象
String[] list = path.list();
//获得当前目录下的文件名和子目录名
for(int i=0; i< list.length; i++)
{
wout.write(list[i]);
wout.flush();
System.out.println(list[i]);
}
//将文件名和子目录名发送到客户端
}
//从客户端获得要下载的文件名
String filename = bufin.readLine();
FileReader filein = new FileReader(filename);
//创建文件输出流对象
int c;
while((c = filein.read())!= -1)
wout.write(c); //将文件发送过去
}catch(IOException e){ }
} } }
三、实验结果
1)测试数据
127.0.0.1
2)实验的现象
在客户端的 TextField 中输入一个网址,点击“链接”按钮时,客户端与服务器建立连接,点击“断开”按钮时链接断开。

当点击“发送请求”按钮时,向服务器发送字符串“ls”,服务器将特定目录下的文件名发送到客户端,并在 TextArea 中显示,然后客户端根据接收到的文件名,在TestField 中输入文件名,然后点击“下载文件”按钮,从服务器端下载指定的文件,并保存在指定目录的文件中。

具体的运行效果如下图所示:
2) 实验数据的处理
首先运行服务器,在服务器端创建一个 ServerSocket 对象,然后通过调用类中的accept()方法使服务器处于监听客户端请求的状态,再运行客户端,在客户端的 TextField 中输入一个网址,点击“链接”按钮时,客户端创建 Scoket 对象与服务器建立连接,点击
“断开”按钮时调用 Socket 的 close()方法链接断开。

当点击“发送请求”按钮时,向服务器发送字符串“ls”,服务器将特定目录下的文件名发送到客户端,并追加在 TextArea 中显示,然后客户端根据接收到的文件名,在TestField 中输入文件名,然后点击“下载文件”按钮,从服务器端下载指定的文件,并保存在指定目录的文件中。

四、讨论与分析
该程序在客户端继承了Applet类来实现图形用户界面,在布局上利用了 Panel 面板,为面板对象创建了 FlowLayout 流式对象,为Applet 创建了BorderLayout 布局,将各个控件添加到面板上,并为按钮控件添加事件监听器,响应按钮点击事件。

在服务器端,首先创建了一个 ServerSocket 对象,然后通过其对象调用accept()方法,返回一个 Socket 对象,于是服务器处于监听状态。

在客户端,当点击“连接”按钮时,由类 TextField 的方法 getText()获得输入的 IP地址,然后根据输入的 IP 创建 Socket 对象。

当点击“断开”按钮时,调用 Socket 类中的close()方法,关闭套接字。

当点击“发送请求”按钮时,通过套接字的对象调用 getInputStream()方法和 getOutputStream()方法,获得输入、输出流,并对流进行包装,然后利用输出流向服务器发送字符串“ls”。

当服务器接收到“ls”字符串时,就在当前内目录下创建文件对象,并利用文件类中的 list()方法获得当前目录下的文件名,并将获得的文件名发送到客户端,客户端在接收到文件名时,就将文件名追加到 TextArea 的末尾。

然后从键盘输入要下载的文件名,点击“下载文件”按钮,将输入的文件名发送到服务器。

当服务器接收到要下载的文件名时,通过创建文件流对象,将文件的内容发生到客户端。

客户端首先创建一个文件对象,和文件输入流,将读取到的文件保存起来。

当读取完毕后关闭流对象。

相关文档
最新文档