www.pudn.com > P2P file system.rar > P2PClient.java


package client; 
 
import java.awt.*; 
import java.awt.event.*; 
 
import javax.swing.*; 
 
import download.DownloadListener; 
import download.Downloader; 
import util.FileInformation; 
 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
import java.net.UnknownHostException; 
import java.util.*; 
 
/** 
 * 

Title: P2P File System

* *

Description:

* *

Copyright: Copyright (c) 2006

* *

Company: Fudan University

* * @author Caihong * @version 1.0 */ public class P2PClient extends JFrame implements ActionListener, MouseListener { /** * */ private long mouseTime; private boolean connected; private JSplitPane jspMain, jspLocal; private JTextField jtfServer, jtfPort, jtfLocalPath; private JButton jbtnConn, jbtnRefresh, jbtnDown, jbtnQuit, jbtnUp, jbtnAdd, jbtnDel; private LocalFileTable localFileTable; private ResourceFileTable serverResourceTable, clientResourceTable; private Socket servSocket; private ObjectOutputStream output; private ObjectInputStream input; private JLabel jlblState; private DownloadListener download; public static void main(String[] args) { new P2PClient(); } public P2PClient() { // super(); try { UIManager .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (ClassNotFoundException e) { System.out.println("UI Not Found"); e.printStackTrace(); } catch (Exception e) { System.out.println("UI Exception"); e.printStackTrace(); } Container container = this.getContentPane(); container.setLayout(new BorderLayout()); // this.setJMenuBar(jmbMenuBar); /* * init server resource */ JToolBar jtbServer = new JToolBar(); JLabel jlblServer = new JLabel("server:"); jtbServer.add(jlblServer); jtfServer = new JTextField("10.130.6.53", 15); jtbServer.add(jtfServer); JLabel jlblPort = new JLabel("Port:"); jtbServer.add(jlblPort); jtfPort = new JTextField("5678", 5); jtbServer.add(jtfPort); jbtnConn = new JButton("Connect"); jbtnConn.addActionListener(this); jtbServer.add(jbtnConn); jbtnRefresh = new JButton("Refresh"); jbtnRefresh.addActionListener(this); jbtnRefresh.setEnabled(false); jtbServer.add(jbtnRefresh); jbtnDown = new JButton("Download"); jbtnDown.addActionListener(this); jbtnDown.setEnabled(false); jtbServer.add(jbtnDown); /* jbtnQuit = new JButton("Quit"); jbtnQuit.addActionListener(this); jtbServer.add(jbtnQuit); */ JPanel jpnlServer = new JPanel(); jpnlServer.setLayout(new BorderLayout()); jlblState = new JLabel("State: Not Connected!"); serverResourceTable = new ResourceFileTable(); jpnlServer.add(jtbServer, BorderLayout.NORTH); jpnlServer.add(new JScrollPane(serverResourceTable), BorderLayout.CENTER); jpnlServer.add(jlblState, BorderLayout.SOUTH); /* * init client resource */ JToolBar jtbLocal = new JToolBar(); jtfLocalPath = new JTextField(); jtbLocal.add(jtfLocalPath); jtfLocalPath.addActionListener(this); localFileTable = new LocalFileTable(); localFileTable.goToDir("."); localFileTable.addMouseListener(this); this.setLocalPath(); jbtnUp = new JButton("up"); jbtnUp.addActionListener(this); jtbLocal.add(jbtnUp); jbtnAdd = new JButton("Add"); jbtnAdd.addActionListener(this); jtbLocal.add(jbtnAdd); JPanel jpnlLocalFile = new JPanel(); jpnlLocalFile.setLayout(new BorderLayout()); jpnlLocalFile.add(jtbLocal, BorderLayout.NORTH); jpnlLocalFile.add(new JScrollPane(localFileTable), BorderLayout.CENTER); clientResourceTable = new ResourceFileTable(); JToolBar jtbLocalResource = new JToolBar(); jbtnDel = new JButton("Delete"); jbtnDel.addActionListener(this); jtbLocalResource.add(jbtnDel); JPanel jpnlLocalRescouce = new JPanel(); jpnlLocalRescouce.setLayout(new BorderLayout()); jpnlLocalRescouce.add(new JScrollPane(clientResourceTable), BorderLayout.CENTER); jpnlLocalRescouce.add(jtbLocalResource, BorderLayout.SOUTH); jspLocal = new JSplitPane(JSplitPane.VERTICAL_SPLIT, jpnlLocalRescouce, jpnlLocalFile); jspLocal.setDividerLocation(300); jspMain = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jpnlServer, jspLocal); jspMain.setDividerLocation(400); container.add(jspMain, BorderLayout.CENTER); servSocket = new Socket(); connected = false; this.setSize(800, 600); this.setTitle("P2P client"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if (source == jbtnConn) { try { if (connected) { disconnect(); } else { connect(); } } catch (Exception ex) { } } else if (source == jbtnRefresh) { refresh(); } else if (source == jbtnDown) { int row = serverResourceTable.getSelectedRow(); if (row != -1) { if (serverResourceTable.isDirectory(row)) { } else if (connected) { FileInformation fileinfo = (FileInformation) serverResourceTable .getFile(row); Downloader downloader = new Downloader(fileinfo, localFileTable.getDir()); downloader.run(); localFileTable.refresh(); } } } else if (source == jbtnQuit) { disconnect(); System.exit(0); } else if (source == jbtnAdd) { this.addToServer(); } else if (source == jbtnDel) { this.delFromServer(); } //path up else if (source == jbtnUp) { localFileTable.goToUpDir(); setLocalPath(); } //set local path else if (source == jtfLocalPath) { localFileTable.goToDir(jtfLocalPath.getText()); setLocalPath(); } } private void disconnect() { try { System.out.println("2"); output.writeObject("close " + localFileTable.getLocalhost()); System.out.println("2"); output.close(); input.close(); servSocket.close(); System.out.println("2"); jbtnConn.setText("Connect"); jlblState.setText("Disconnected"); jbtnRefresh.setEnabled(false); jbtnDown.setEnabled(false); System.out.println("2"); connected = false; download.close(); System.out.println("3"); } catch (IOException e) { e.printStackTrace(); } } private void connect() { try { servSocket = new Socket(this.jtfServer.getText(), Integer .parseInt(this.jtfPort.getText())); output = new ObjectOutputStream(servSocket.getOutputStream()); input = new ObjectInputStream(servSocket.getInputStream()); System.out.println("Connect!!!!!!!!!!!!!!!!!!!!"); download = new DownloadListener(); // download.run(); connected = true; refresh(); jbtnConn.setText("DisConn"); jbtnRefresh.setEnabled(true); jbtnDown.setEnabled(true); jlblState.setText("Connected to " + this.jtfServer.getText()); } catch (NumberFormatException e) { System.out.println("NumberFormatException"); e.printStackTrace(); } catch (UnknownHostException e) { System.out.println("UnknownHostException"); e.printStackTrace(); } catch (IOException e) { jlblState.setText("Connection refused"); } } private void refresh() { try { output.writeObject("list"); String c = (String) input.readObject(); int count = Integer.parseInt(c); Vector files = new Vector(); for (int i = 0; i < count; i++) { files.add(input.readObject()); } this.serverResourceTable.setFile(files); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private void addToServer() { int row = localFileTable.getSelectedRow(); if (row != -1) { if (localFileTable.isDirectory(row)) { localFileTable.selectDir(row); setLocalPath(); } else if (connected) { FileInformation fileinfo = (FileInformation) localFileTable .getFile(row); if (clientResourceTable.fileExist(fileinfo) == -1) { clientResourceTable.addFile(fileinfo); try { output.writeObject("publish"); output.flush(); output.writeObject(fileinfo); output.flush(); String msg = (String) input.readObject(); if (msg.equals("success")) serverResourceTable.addFile(fileinfo); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } } } } private void delFromServer() { int row = clientResourceTable.getSelectedRow(); if (row != -1) { if (clientResourceTable.isDirectory(row)) { } else if (connected) { FileInformation fileinfo = (FileInformation) clientResourceTable .getFile(row); clientResourceTable.removeFile(row); serverResourceTable.removeFile(clientResourceTable .fileExist(fileinfo)); try { serverResourceTable.removeFile(clientResourceTable .fileExist(fileinfo)); output.writeObject("update " + localFileTable.getLocalhost()); output.flush(); output.writeObject(fileinfo); output.flush(); String msg = (String) input.readObject(); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } } } public void setLocalPath() { this.jtfLocalPath.setText(localFileTable.getDir()); } public void mouseClicked(MouseEvent e) { long time = new Date().getTime(); //double click if (time - mouseTime < 600) { addToServer(); } mouseTime = time; } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }