//Import klasser import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import javax.swing.border.*; /** JFtp class gjord av Robert Meurlin version 1.0 ny förbättrad version kommer tillsammans med INS gesäll fast då med PGP startas från kommandoraden med argumentvekotrn. har tänkt att göra kommandon men har inte hittat något att få in commando fönstret i själva JFramen men det blir till INS gesällprovet då jag tänkt lägga in stöd för PGP också. */ public class JFtp extends JFrame { private static String hostA = ""; private static int port = 0, max = 0; private static Vector sockets = null; private static JFtp tp; private static String fileName = "",path = ""; private static int check = 0, ch = 0; private static Socket connection = null; private static ObjectOutputStream out = null; private static ObjectInputStream in = null; private static InetAddress bindAddr = null; //grafik private JButton send = new JButton("Send files"); private JButton browse = new JButton("Browse files"); private JButton reset = new JButton("Reset"); private JButton connect = new JButton("Connect"); private JButton help = new JButton("Help"); private JLabel userl = new JLabel("User ID: "); private JLabel passl = new JLabel("Password: "); private JLabel hostl = new JLabel("Host Name: "); private JLabel coml = new JLabel("kommando: "); private JLabel filel = new JLabel("File: "); private JTextField passf = new JTextField(30); private JTextField userf = new JTextField(30); private JTextField hostf = new JTextField(30); private JTextField comf = new JTextField(30); private JTextField filef = new JTextField(30); private JTextArea message = new JTextArea(30, 20); private JScrollPane jsp = new JScrollPane(message); /* Main klassen som ska ta emot argument från kommandoraden och ska skicka vidare argumentet till den publika metoden JFtp som tar valet som enda argument.*/ public static void main (String [] args) throws IOException { BufferedReader stdin = new BufferedReader(new InputStreamReader (System.in)); System.out.println("1. Anslut dig till en ftp-server"); System.out.println("2. Skapa en ftp-server"); System.out.println(); System.out.print("Gor ett Val!!: "); System.out.flush(); int choice = Integer.parseInt(stdin.readLine()); if (choice == 1) { System.out.print("Skriv in addressen du vill ansluta dig till: "); System.out.flush(); hostA = stdin.readLine(); port = 21; } else if (choice == 2) { System.out.print("Ange portnummer som klienterna ska ansluta till : "); System.out.flush(); port = Integer.parseInt(stdin.readLine()); System.out.print("Ange max nummer av klienter for denna server : "); System.out.flush(); max = Integer.parseInt(stdin.readLine()); //Här bör man fråga användaren vilken ip han vill ansluta sig till men men.... bindAddr = InetAddress.getByName("192.168.0.189"); } tp = new JFtp(choice); }//main klassen!!!! /*Tar emot argumenten som vi ger på kommandoraden, här skapas även grafikobjekten. */ public JFtp (int c) { super("ftp klient/Server"); getContentPane().setLayout(new BorderLayout()); JPanel labels = new JPanel(); labels.setLayout(new GridLayout(5, 1)); hostl.setForeground(Color.black); labels.add(hostl); JPanel fields=new JPanel(); fields.setLayout(new GridLayout(5, 1)); String hostprop = System.getProperty("ftp.dsv.su.se", ""); hostf.setText(hostprop); JPanel statustext = new JPanel(); statustext.setLayout(new GridLayout(5, 1)); //ändra färg när man klickar i hostfältet hostf.addFocusListener(new FocusAdapter(){ public void focusGained(FocusEvent e){ hostl.setForeground(new Color(98,156,245)); } }); hostf.addFocusListener(new FocusAdapter(){ public void focusLost(FocusEvent e){ hostl.setForeground(Color.black); } }); //lägg till i resp panel. labels.add(userl); fields.add(hostf); hostf.setText(hostA); userl.setForeground(Color.black); fields.add(userf); passl.setForeground(Color.black); labels.add(passl); fields.add(passf); labels.add(filel); fields.add(filef); filel.setForeground(Color.black); coml.setForeground(Color.black); labels.add(coml); fields.add(comf); //Fokuslyssnare som ändrar färg när man klickar i rutan. comf.addFocusListener(new FocusAdapter(){ public void focusGained(FocusEvent e){ coml.setForeground(new Color(98,156,245)); } }); comf.addFocusListener(new FocusAdapter(){ public void focusLost(FocusEvent e){ coml.setForeground(Color.black); } }); comf.setFont(new Font("SansSerif",Font.BOLD,14)); //Norra panelen. Box north = Box.createHorizontalBox(); north.add(labels); north.add(fields); //mitten message.setFont(new Font("SansSerif",Font.BOLD,14)); jsp.setBorder(new TitledBorder(new EtchedBorder(),"Status Field")); //Södra panelen JPanel p4=new JPanel(new FlowLayout()); send.setMnemonic('e'); p4.add(connect); p4.add(browse); p4.add(send); p4.add(reset); p4.add(help); //Lyssnare, anropa en ActionPerformed class:: send.addActionListener(new buttonListener()); browse.addActionListener(new buttonListener()); reset.addActionListener(new buttonListener()); help.addActionListener(new buttonListener()); connect.addActionListener(new Connect()); //lägg till komponenterna i "containern" getContentPane().add(north,BorderLayout.NORTH); getContentPane().add(jsp,BorderLayout.CENTER); getContentPane().add(p4,BorderLayout.SOUTH); addWindowListener(new WindowAdapter () { public void windowClosing (WindowEvent e) { System.exit(0); } } ); setSize(600,500); setResizable(false); setVisible(true); //Grafik slut!!! /*KLIENT FTP check används för att fastställa om det är en klient ftp eller server ftp 10 = klient ftp inputdata inskriven host och porten, där objektet receive ska hantera flaggan. case 0 förbindelse. case 1 bara en bekräftlelse på att filen kommer att tas emot av mottagaren. case 2 om filen kom fram */ if (c==1){ check = 10; //starta en vanlig klient server på aktuella portar som hämtas från textfälten try { connection = new Socket (hostA,port); out = new ObjectOutputStream(connection.getOutputStream()); out.flush(); in = new ObjectInputStream(connection.getInputStream()); int flag = 0; while (true) { Object recieved = in.readObject(); switch (flag) { case 0: if (recieved.equals("sot")) { flag++; } break; case 1: //bekräfta med Yes eller No fileName = (String) recieved; int option = JOptionPane.showConfirmDialog(this,connection.getInetAddress().getHostName()+" skickar dig denna fil: "+fileName+"!\nVill du ta emot den?"," bekrafta!!",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE); if (option == JOptionPane.YES_OPTION) { flag++; } else flag = 0; break; case 2: //ta emot en fil ström som skriver i aktuell katalog byte[] b = (byte[])recieved; FileOutputStream ff = new FileOutputStream(fileName); ff.write(b); flag = 0; JOptionPane.showMessageDialog(this,"File Mottagen!","Bekraftelse",JOptionPane.INFORMATION_MESSAGE); break; }//switch Thread.yield(); }//while }//try satsen catch (Exception e) {System.out.println(e);} }//IF satsen /* När c var 2 i argumentvektorn motsvarade det en Server ftp. SERVER Ftp där igen vi kollar check siffran till 5 för en server. Startar en Serversocket som lyssnar på aktuell port och max användare så länge den är online */ if (c==2){ sockets = new Vector(); check = 5; try { //skapa sen server socket ServerSocket connect = new ServerSocket(port,max, bindAddr); while (true) { sockets.addElement(new ThreadedSocket(connect.accept())); System.out.println("Server lyssnar at portnr: " + port + "\n"); System.out.println("Max clients for this server is: " + max + "\n"); Thread.yield(); } } catch (IOException ioe) {System.out.println(ioe);} }//if }//PUBLIC JFtp //fil dialog som laddar ett Välj Fil.. fönster och returnerar sökvägen till vald fil. public static String showDialog () { FileDialog fd = new FileDialog(new JFrame(),"Välj Fil...",FileDialog.LOAD); fd.show(); return fd.getDirectory()+fd.getFile(); } /*knapp lyssnare för alla knappar. Där knappen browse anropar showdialog, lägger den säkväg i filefältet och lägger till 2 backslash för filöverf. Skicka knappen där säkvägen packar den i bytes och sen läser. Sen avgör den om det ska till klienten eller servern, klienten skickar, Servern skriver temporärt. reset tömmer alla fält nåja nästan. help skulle vara för kommnadona. */ class buttonListener implements ActionListener { public void actionPerformed (ActionEvent e) { byte[] array = null; if (e.getSource() == browse) { path = showDialog(); filef.setText(path); int index = path.lastIndexOf("\\"); fileName = path.substring(index+1); } //om det är skicka knappen if (e.getSource() == send) { //lägg i en Inpustream som där en sökväg som argument. try { FileInputStream f = new FileInputStream (path); int size = f.available(); array = new byte[size]; f.read(array,0,size); //server ska ta emot filen som klienten skickar & lägga i aktuell katalog if (check == 5) { for (int i=0;i