请教一下,模拟FTP的获取服务器文件目录的方法应该怎么实现?(不用ftp类)
下面是我的代码,比较乱,错误也比较严重。
服务器端
package work1;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextArea;import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.io.FileWriter;
import java.io.FileReader;import java.net.ServerSocket;
import java.net.Socket;public class ftpserver extends JFrame implements ActionListener { /**
 * 
 */
private static final long serialVersionUID = 1L; /**
 * @param args
 */
static ServerSocket listenport;
static ServerSocket dataport;
Socket socket;
InputStream is;
OutputStream os;
PrintStream ps;
BufferedReader br; int i = 1;
int back = 0; JPanel jp1 = new JPanel(), jp2 = new JPanel(), jp3 = new JPanel();
JButton jb = new JButton("开始");
JTextArea jl = new JTextArea();
static File f; ftpserver() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(240, 120);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
Dimension frameSize = this.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
this.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
this.add(jp1);
jp1.setLayout(new BorderLayout());
jb.addActionListener(this);
jp1.add(jl, BorderLayout.NORTH);
jp1.add(jb, BorderLayout.CENTER);
this.setVisible(true);
} public static void main(String[] args) { try {
f = createfile();
dataport = new ServerSocket(2326);
listenport = new ServerSocket(2332);
new ftpserver();
} catch (Exception e) {
// 只允许开1个服务器;
}
} public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
if (ob.equals(jb)) {
new Thread(new Runnable() {
public void run() {
while (true) {// 全天候监听;
work();
}
}
}).start();
}
} private void work() {
try {
socket = listenport.accept();
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
os = socket.getOutputStream();
ps = new PrintStream(os); new Thread(new Runnable() {
public void run() {
try {
while (socket != null) {
String frist = br.readLine();
if (frist.startsWith("222 Login")) {
String string = frist.substring(4);
back = check(string);
ps.println(back);
}
if (frist.startsWith("111 register")) {
String string = frist.substring(4);
back = Login(string);
ps.println(back);
}
if (frist.startsWith("list")) {
List(1, "E:/test");
System.out.println("List complete!!");
ps.println("555 List complete!!");
}
if (frist.startsWith("get")) {
String name = frist.substring(4).trim();
get(name);
ps.println("666 getfile complete!!");
System.out.println("get complete!!");
}
if (frist.startsWith("put")) {
String name = frist.substring(4).trim();
put(name);
ps.println("777 sendfile complete!!");
System.out.println("put complete!!");
}
}
} catch (Exception e) { }
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
} private static File createfile() {
File file1 = new File("E:/test");
file1.mkdirs();
return file1; } protected void put(String name) {
// TODO Auto-generated method stub
int count;
byte[] bytebuffer = new byte[1024]; try {
Socket datasocket = dataport.accept();
InputStream is_data = datasocket.getInputStream();
RandomAccessFile accfile = new RandomAccessFile(f.getAbsolutePath()
+ "\\" + name, "rw"); while ((count = is_data.read(bytebuffer)) != -1) {
accfile.write(bytebuffer, 0, count);
}
accfile.close();
is_data.close();
datasocket.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("error 1 in put()");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("error 2 in put()");
} } protected void get(String name) {
// TODO Auto-generated method stub
File file = new File(name);
file.mkdirs();
int count;
if (file.isFile()) {
try {
Socket data = new Socket("127.0.0.1", 2330);
OutputStream os_data = data.getOutputStream();
RandomAccessFile sendfile = new RandomAccessFile(name, "r");
byte[] bytebuffer = new byte[1024];
while ((count = sendfile.read(bytebuffer)) != -1) {
os_data.write(bytebuffer, 0, count);
}
os_data.flush();
os_data.close();
sendfile.close();
data.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("error 3 in get()");
}
} else {
file.delete();
} } private void List(int b, String path) throws Exception {
// TODO Auto-generated method stub
File file = new File(path);
file.mkdirs();
String[] fname = file.list();
String look;
try {
Socket data = new Socket("127.0.0.1",2330);
OutputStream os_data = data.getOutputStream();
PrintStream ps_data = new PrintStream(os_data);
for (int t = 0; t < fname.length; t++) {
                             //这里我用一个int表示文件所在第N层,“+/-”表示文件/文件夹
if (fname[t].indexOf(".") == -1) {
look = "-";// 文件夹;
int c = b + 1;
System.out.println(b + " " + look + " " + fname[t]);
List(c, file.getAbsolutePath() + "/" + fname[t]);//递归
ps_data.println(b+"|"+look+"|"+fname[t]);
} else {
look = "+";//文件
ps_data.println(b+"|"+look+"|"+fname[t]);
System.out.println(b + " " + look + " " + fname[t]);
}
}
ps_data.flush();
ps_data.close();
os_data.close();
data.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

解决方案 »

  1.   

    客户端
    package work1;import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.BorderLayout;
    import java.io.BufferedReader;
    import java.io.EOFException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.io.RandomAccessFile;
    import java.io.FileWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;public class test extends JFrame implements ActionListener { /**
     * 
     */
    private static final long serialVersionUID = 1L; /**
     * @param args
     */
    JPanel jp1 = new JPanel(), jp2 = new JPanel(), jp3 = new JPanel();
    JButton jb1 = new JButton("444 get"), jb2 = new JButton("444 put"),
    jb3 = new JButton("444 list");
    JTree tree = new JTree();
    static DefaultMutableTreeNode root = new DefaultMutableTreeNode("服务器目录");
    static Socket socket;
    static ServerSocket con;
    static Socket ss;
    static Socket s;
    static ServerSocket so;
    static InputStream is;
    InputStream is_data;
    OutputStream os;
    PrintStream ps;
    static BufferedReader br; test() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(240, 120);
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    Dimension frameSize = this.getSize();
    if (frameSize.height > screenSize.height) {
    frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
    frameSize.width = screenSize.width;
    }
    this.setLocation((screenSize.width - frameSize.width) / 2,
    (screenSize.height - frameSize.height) / 2);
    this.add(jp1);
    jp1.setLayout(new BorderLayout());
    jp1.add(jp2, BorderLayout.NORTH);
    jp1.add(jp3, BorderLayout.SOUTH);
    jp1.add(jb1, BorderLayout.WEST);
    jp1.add(jb2, BorderLayout.CENTER);
    jp1.add(jb3, BorderLayout.EAST);
    jb1.addActionListener(this);
    jb2.addActionListener(this);
    jb3.addActionListener(this);
    this.setVisible(true);
    } public static void main(String[] args) {
    // TODO Auto-generated method stub
    new test(); try {
    con = new ServerSocket(2331);
    so = new ServerSocket(2330);
    socket = new Socket("127.0.0.1", 2332);
    //socket = con.accept();
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    System.exit(0);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    System.exit(0);
    }
    } public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    Object ob = e.getSource();
    try { os = socket.getOutputStream();
    ps = new PrintStream(os);
    if (ob.equals(jb1)) {
    int count;
    ps.println("get e:\\360compkill.zip");
    try {
    s = so.accept();
    System.out.println("conneting!!!");
    is_data = s.getInputStream();
    System.out.println("cog!!!");
    RandomAccessFile accfile = new RandomAccessFile("e:/test/360compkill.zip", "rw");
    byte[] bytebuffer = new byte[1024];
    while ((count = is_data.read(bytebuffer)) != -1) {
    accfile.write(bytebuffer, 0, count);
    }
    accfile.close();
    is_data.close();
    s.close();
    } catch (Exception ew) {
    ew.printStackTrace();
    System.out.println("error 3 in get()");
    }
    } if (ob.equals(jb2)) { ps.println("put IceSword122cn.zip");
    try {

    ss = new Socket("127.0.0.1", 2326);
    os = ss.getOutputStream();
    int count;
    RandomAccessFile f = new RandomAccessFile(
    "e:\\IceSword122cn.zip", "r");
    byte[] bytebuffer = new byte[1024];
    while ((count = f.read(bytebuffer)) != -1) {
    os.write(bytebuffer, 0, count);
    }
    f.close();
    os.close();
    ss.close();
    } catch (EOFException ee) {
    // TODO Auto-generated catch block
    ee.printStackTrace();
    } catch(Exception eeee){
    eeee.printStackTrace();
    }
    } if (ob.equals(jb3)) {
    FileWriter fw = new FileWriter("e:/test/1111.txt");
    ps.println("list");
    s = so.accept();
    is_data = s.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is_data));
    String str = br.readLine();
    while(str != null){
    fw.write(str+'\n');不知道为什么这里写入TXT的只有最上层文件名
    str = br.readLine();
    }
    fw.close();
    is_data.close();
    s.close();
    new Tree();
    }
    } catch (UnknownHostException e1) { } catch (Exception e1) { }

    }
    }
    文件目录框架
    package work1;import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;public class Tree extends JFrame implements TreeSelectionListener{ /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JSplitPane jsp = new JSplitPane();
    JScrollPane jsc = new JScrollPane();
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("服务器");
    JTree tree = new JTree(root);
    Tree() {
    super("xianshi");
    this.setSize(600,500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().add(jsp);
    jsp.setLeftComponent(jsc);
    jsc.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    jsc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    jsc.getViewport().setView(tree);
    setTree(root,0);
    this.setVisible(true);
    } private static void setTree(DefaultMutableTreeNode tree, int i) {
    try {
    FileReader fr = new FileReader("e:/test/1111.txt");
    BufferedReader br = new BufferedReader(fr);
    String name = br.readLine();
    while (name != null) {
    int ceng = Integer.parseInt(name.substring(0, 1));
    String p = name.substring(2, 3);
    String fname = name.substring(4).trim();
    System.out.println(ceng + " " + p + " " + fname);
    if (ceng == i + 1) {
    if (p.equals("+")) {
    DefaultMutableTreeNode d = new DefaultMutableTreeNode(
    fname);
    tree.add(d);
    } else {
    DefaultMutableTreeNode d = new DefaultMutableTreeNode(
    fname);
    tree.add(d);
    setTree(d, ceng);
    }
    }
    name = br.readLine();
    }
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public void valueChanged(TreeSelectionEvent e) {
    // TODO Auto-generated method stub

    }

    public static void main(String[] args){
    new Tree();
    }}
      

  2.   

    不好意思,忘记问问题,
    我想请教的是,
    1。FTP客户端也要用ServerSocket来绑定两个端口么?
    2。上面List函数为什么有时候会print不正确?
    3。为什么写TXT的时候只写了最上层?感谢:看完这些的人
    特别感谢:有回复的人
    最感谢:解答的人...
      

  3.   

    FTP 21控制 20 数据一半来说你本地的CLIENT也开俩个PORT一个事法控制命令,一个数据传输。也可以多线程效率更号一些。