file send download

This commit is contained in:
Jakub Adamski 2019-11-22 14:51:44 +01:00
parent 0085add47c
commit 8286be5e97
5 changed files with 155 additions and 53 deletions

View File

@ -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

Binary file not shown.

View File

@ -24,6 +24,20 @@
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
<build>

View File

@ -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<String> messagesL;
static DataOutputStream tDos;
static DefaultListModel<String> 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<String>(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<byte[]> fileBList = new ArrayList<byte[]>(); //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<fileBList.size(); i++){
fileB = ArrayUtils.addAll(fileB, fileBList.get(i));
}
FileUtils.writeByteArrayToFile(new File(messString.substring(10, messString.length())), fileB); //zapis pliku
addMessage("ZAPISANO PLIK");
} else {
tSocket = new Socket(tAddr, tPort); // laczymy
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
tDos.write(convert(myUserT.getText() + "> " + 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

View File

@ -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