diff --git a/README.md b/README.md index c419d81..a4aca03 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,21 @@ Serwer na zasadzie przesylania wiadomosci Klient okresla do kogo ma wyslac + +TODO: +usunac guzik File + +/DOWNLOAD nazwapliku ->polecenie +user> DOWNLOAD: nazwapliku -> wysylam +FILE: dlugosc pliku -> odbieram +odbieranie pliku w innym procesie +koniec polaczenia + +/EXIT to wylogowanie + +/FILE sciezkaDoPliku -> polecenie do wyslania +user> FILE:nazwa:dlugosc -> wysylam cos takiego +wysylanie pliku w czesciach (konwertuje do bajtow) +koniec polaczenia + +/Users/kuba/Downloads/Vocab1.pdf \ No newline at end of file diff --git a/klient/Projekt-Final.jar b/klient/Projekt-Final.jar index a14431f..4545da7 100644 Binary files a/klient/Projekt-Final.jar and b/klient/Projekt-Final.jar differ diff --git a/klient/pom.xml b/klient/pom.xml index c8cc7cc..c00ad03 100644 --- a/klient/pom.xml +++ b/klient/pom.xml @@ -24,6 +24,20 @@ 4.11 test + + + org.apache.commons + commons-lang3 + 3.9 + + + + + commons-io + commons-io + 2.6 + + diff --git a/klient/src/main/java/Projekt/App.java b/klient/src/main/java/Projekt/App.java index a1975e5..4b901d5 100644 --- a/klient/src/main/java/Projekt/App.java +++ b/klient/src/main/java/Projekt/App.java @@ -4,31 +4,62 @@ import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; +import javax.swing.JScrollPane; import javax.swing.JTextField; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.ArrayUtils; + import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.File; import java.net.InetAddress; import java.net.Socket; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; /* Lepiej lapac exception!!! +CZY po wyjsciu z aplikacji zamkaja sie tez inne procesy? chyba tak */ public class App { - static Socket tSocket; // przy evencie musi byc static albo w klasie musi byc final - static JTextField ipText, portText, messageT, myUserT; + static JTextField ipText, portText, messageT, myUserT; // przy evencie musi byc static albo w klasie musi byc final static JFrame frame = new JFrame("Messages"); - static JButton mSendB, fSendB, connectB; + static JButton mSendB, connectB; static JList messagesL; - static DataOutputStream tDos; static DefaultListModel messages = new DefaultListModel<>(); + static JScrollPane sPane; + + static Thread receiveThread = new Thread() { //watek w ktorym bedziemy tylko odbierac wiadomosci + public void run() { //uwazac zeby nie dochodzic jednoczesnie do tej samej zmiennej (synchronize?) + Socket rSocket; + try { + InetAddress rAddr = InetAddress.getByName(ipText.getText()); + int rPort = Integer.parseInt(portText.getText()); + rSocket = new Socket(rAddr, rPort + 1); // laczymy + DataInputStream rDis = new DataInputStream(rSocket.getInputStream()); // tu bedziemy przyjmowac wiadomosci + addMessage("LISTEN CONNECTION OK"); + while (true) { //czytamy wiadomosc + byte[] rec = new byte[1024]; + if (rDis.read(rec) > 0){ + String s = new String(rec); + addMessage(s); + } + } + } catch (Exception ae) { + ae.printStackTrace(); + addMessage("REC CANT CONNECT"); + } + return; + } + }; public static void main(String[] args) { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(320, 400); - //CZY po wyjsciu z aplikacji zamkaja sie tez inne procesy? chyba tak - ipText = new JTextField("0.0.0.0"); ipText.setBounds(10, 10, 200, 30); portText = new JTextField("44444"); @@ -38,42 +69,15 @@ public class App { connectB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ //zapobiegac podwojnemu kliknieciu w connect! - Thread receiveThread = new Thread() { //watek w ktorym bedziemy tylko odbierac wiadomosci - public void run() { //uwazac zeby nie dochodzic jednoczesnie do tej samej zmiennej (synchronize?) - Socket rSocket; - DataInputStream rDis; - try { - InetAddress rAddr = InetAddress.getByName(ipText.getText()); - int rPort = Integer.parseInt(portText.getText()); - rSocket = new Socket(rAddr, rPort + 1); // laczymy - rDis = new DataInputStream(rSocket.getInputStream()); // tu bedziemy przyjmowac wiadomosci - messages.addElement("Listen connection ok"); - messagesL.setModel(messages); - while (true) { - //czytamy wiadomosc - byte[] rec = new byte[1024]; - if (rDis.read(rec) > 0){ - String s = new String(rec); - messages.addElement(s); - messagesL.setModel(messages); - } - } - - } catch (Exception ae) { - ae.printStackTrace(); - ipText.setText("REC CANT CONNECT"); - } - return; - } - }; - receiveThread.start(); } }); + myUserT = new JTextField("Nick"); myUserT.setBounds(10, 50, 100, 30); messagesL = new JList(messages); - messagesL.setBounds(10, 130, 300, 150); + sPane = new JScrollPane(messagesL); + sPane.setBounds(10, 130, 300, 150); messageT = new JTextField("Message"); messageT.setBounds(10, 290, 300, 30); mSendB = new JButton("Send"); @@ -81,31 +85,85 @@ public class App { mSendB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //wysylanie wiadomosci try { - //ustanawiamy polaczenie na wysylanie wiadomosci - InetAddress tAddr = InetAddress.getByName(ipText.getText()); + InetAddress tAddr = InetAddress.getByName(ipText.getText()); //ustanawiamy polaczenie na wysylanie wiadomosci int tPort = Integer.parseInt(portText.getText()); - tSocket = new Socket(tAddr, tPort); // laczymy - tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci - tDos.write(convert(myUserT.getText() + "> " + messageT.getText())); //wysylamy - messageT.setText(""); - tSocket.close(); //czy to tez trzeba? - + String messString = messageT.getText(); + DataOutputStream tDos; + DataInputStream tDis; + Socket tSocket; + String toCheckString = messString + "xdddddddd"; //sprawdzany string zawsze bedzie mial min 9 znakow + + if (toCheckString.substring(0, 5).equals("/FILE")){ //CHYBA OK? wysylanie pliku + String fileName = messString.substring(6, messString.length()); //uzyskujemy sciezke do pliku + System.out.println(fileName); + File sendFile = new File(fileName); + if (!sendFile.exists() || !sendFile.isFile()) { //zly plik + addMessage("ZLY PLIK!"); + } else { + System.out.println(sendFile.length()); //wielkosc pliku + tSocket = new Socket(tAddr, tPort); // laczymy + tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci + String[] parsed = messString.split("/"); //chcemy pobrac nazwe pliku + tDos.write(convert(myUserT.getText() + "> FILE:" + parsed[parsed.length-1] + ":" + sendFile.length())); //wysylamy wielkosc pliku + byte[] fileContent = Files.readAllBytes(sendFile.toPath()); //plik do bitow + int wyslano = 0; + while (wyslano < sendFile.length()){ //wysylamy po 1024 + byte[] bufor = new byte[1024]; + System.arraycopy(fileContent, wyslano, bufor, 0, 1024); + tDos.write(bufor); //uwaga dodac sprawdzanie czy na pewno wyslalismy dobra liczbe bajtow + wyslano += 1024; + addMessage("WYSLANO: " + wyslano); + } + messageT.setText(""); + tSocket.close(); //czy to tez trzeba? + } + + } else if(toCheckString.substring(0, 9).equals("/DOWNLOAD")) { //pobieranie pliku + tSocket = new Socket(tAddr, tPort); // laczymy + tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci + tDis = new DataInputStream(tSocket.getInputStream()); //tu przyjmujemy wiadomosci + tDos.write(convert(myUserT.getText() + "> " + messString.substring(1, messString.length()))); //wysylamy prosbe + byte[] rec = new byte[1024]; + String s = new String(); + if (tDis.read(rec) > 0){ + s = new String(rec); //otrzymana wiadomosc o wielkosci pliku + } + int received = 0; + List fileBList = new ArrayList(); //plik + while (received < Integer.parseInt(s)){ //pobieramy zawartosc pliku + rec = new byte[1024]; //czyscimy tablice + if (tDis.read(rec) > 0){ + fileBList.add(rec); //dodajemy do listy + } + received += 1024; + addMessage("POBRANO: " + received); + } + byte[] fileB = fileBList.get(0); + for(int i=1; i " + messString)); //wysylamy + messageT.setText(""); + tSocket.close(); //czy to tez trzeba? + } } catch (Exception ae){ ae.printStackTrace(); - portText.setText("CANT SEND"); + addMessage("CANT SEND"); } } }); - fSendB = new JButton("File"); - fSendB.setBounds(165, 330, 100, 30); - frame.add(ipText); frame.add(portText); - frame.add(messagesL); + frame.add(sPane); frame.add(messageT); frame.add(mSendB); - frame.add(fSendB); frame.add(myUserT); frame.add(connectB); frame.setLayout(null); @@ -113,10 +171,22 @@ public class App { } synchronized static byte[] convert(String wiad){ - byte[] mess = new byte[1024]; - //UWAGA pewnie dluzsze wiadomosci trzeba jakos rozdzielac + byte[] mess = new byte[1024]; //UWAGA pewnie dluzsze wiadomosci trzeba jakos rozdzielac mess = wiad.getBytes(); // konwertujemy na bajty return mess; } + synchronized static void addMessage(String mess){ //funkcja do wsadzania nowych wiadomosci + messages.addElement(mess); + messagesL.setModel(messages); + //messagesL.ensureIndexIsVisible(messages.getSize() - 1); + } + } + + +//byte[] combined = new byte[1024*(i+1)]; //bufor do laczenia +//System.arraycopy(fileB, 0, combined, 0, fileB.length); //kopiowanie +//System.arraycopy(fileBList.get(i), 0, combined, fileB.length, fileBList.get(i).length); +//fileB = new byte[1024*(i+1)]; +//System.arraycopy(combined, 0, fileB, 0, combined.length); //kopiowanie 2 \ No newline at end of file diff --git a/server/uberProstyServer.c b/server/uberProstyServer.c index 0eaff9e..8afa271 100644 --- a/server/uberProstyServer.c +++ b/server/uberProstyServer.c @@ -58,7 +58,7 @@ int main(void) { printf("Wysylam licznik\n"); send(tGniazdo, tBufor, 1024, 0); licznik += 1; - sleep(5); + sleep(3); } } } else { //tutaj odbieram wiadomosci