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