请教一下,模拟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();
}
}
}
下面是我的代码,比较乱,错误也比较严重。
服务器端
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();
}
}
}
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();
}}
我想请教的是,
1。FTP客户端也要用ServerSocket来绑定两个端口么?
2。上面List函数为什么有时候会print不正确?
3。为什么写TXT的时候只写了最上层?感谢:看完这些的人
特别感谢:有回复的人
最感谢:解答的人...