file send download
This commit is contained in:
parent
0085add47c
commit
8286be5e97
18
README.md
18
README.md
@ -3,3 +3,21 @@
|
|||||||
Serwer na zasadzie przesylania wiadomosci
|
Serwer na zasadzie przesylania wiadomosci
|
||||||
|
|
||||||
Klient okresla do kogo ma wyslac
|
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.
@ -24,6 +24,20 @@
|
|||||||
<version>4.11</version>
|
<version>4.11</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -4,31 +4,62 @@ import javax.swing.DefaultListModel;
|
|||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
|
||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.File;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Lepiej lapac exception!!!
|
Lepiej lapac exception!!!
|
||||||
|
CZY po wyjsciu z aplikacji zamkaja sie tez inne procesy? chyba tak
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class App {
|
public class App {
|
||||||
static Socket tSocket; // przy evencie musi byc static albo w klasie musi byc final
|
static JTextField ipText, portText, messageT, myUserT; // przy evencie musi byc static albo w klasie musi byc final
|
||||||
static JTextField ipText, portText, messageT, myUserT;
|
|
||||||
static JFrame frame = new JFrame("Messages");
|
static JFrame frame = new JFrame("Messages");
|
||||||
static JButton mSendB, fSendB, connectB;
|
static JButton mSendB, connectB;
|
||||||
static JList<String> messagesL;
|
static JList<String> messagesL;
|
||||||
static DataOutputStream tDos;
|
|
||||||
static DefaultListModel<String> messages = new DefaultListModel<>();
|
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) {
|
public static void main(String[] args) {
|
||||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
frame.setSize(320, 400);
|
frame.setSize(320, 400);
|
||||||
//CZY po wyjsciu z aplikacji zamkaja sie tez inne procesy? chyba tak
|
|
||||||
|
|
||||||
ipText = new JTextField("0.0.0.0");
|
ipText = new JTextField("0.0.0.0");
|
||||||
ipText.setBounds(10, 10, 200, 30);
|
ipText.setBounds(10, 10, 200, 30);
|
||||||
portText = new JTextField("44444");
|
portText = new JTextField("44444");
|
||||||
@ -38,42 +69,15 @@ public class App {
|
|||||||
connectB.addActionListener(new ActionListener() {
|
connectB.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent e){
|
public void actionPerformed(ActionEvent e){
|
||||||
//zapobiegac podwojnemu kliknieciu w connect!
|
//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();
|
receiveThread.start();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
myUserT = new JTextField("Nick");
|
myUserT = new JTextField("Nick");
|
||||||
myUserT.setBounds(10, 50, 100, 30);
|
myUserT.setBounds(10, 50, 100, 30);
|
||||||
messagesL = new JList<String>(messages);
|
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 = new JTextField("Message");
|
||||||
messageT.setBounds(10, 290, 300, 30);
|
messageT.setBounds(10, 290, 300, 30);
|
||||||
mSendB = new JButton("Send");
|
mSendB = new JButton("Send");
|
||||||
@ -81,31 +85,85 @@ public class App {
|
|||||||
mSendB.addActionListener(new ActionListener() {
|
mSendB.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent e) { //wysylanie wiadomosci
|
public void actionPerformed(ActionEvent e) { //wysylanie wiadomosci
|
||||||
try {
|
try {
|
||||||
//ustanawiamy polaczenie na wysylanie wiadomosci
|
InetAddress tAddr = InetAddress.getByName(ipText.getText()); //ustanawiamy polaczenie na wysylanie wiadomosci
|
||||||
InetAddress tAddr = InetAddress.getByName(ipText.getText());
|
|
||||||
int tPort = Integer.parseInt(portText.getText());
|
int tPort = Integer.parseInt(portText.getText());
|
||||||
|
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
|
tSocket = new Socket(tAddr, tPort); // laczymy
|
||||||
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
||||||
tDos.write(convert(myUserT.getText() + "> " + messageT.getText())); //wysylamy
|
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("");
|
messageT.setText("");
|
||||||
tSocket.close(); //czy to tez trzeba?
|
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){
|
} catch (Exception ae){
|
||||||
ae.printStackTrace();
|
ae.printStackTrace();
|
||||||
portText.setText("CANT SEND");
|
addMessage("CANT SEND");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
fSendB = new JButton("File");
|
|
||||||
fSendB.setBounds(165, 330, 100, 30);
|
|
||||||
|
|
||||||
|
|
||||||
frame.add(ipText);
|
frame.add(ipText);
|
||||||
frame.add(portText);
|
frame.add(portText);
|
||||||
frame.add(messagesL);
|
frame.add(sPane);
|
||||||
frame.add(messageT);
|
frame.add(messageT);
|
||||||
frame.add(mSendB);
|
frame.add(mSendB);
|
||||||
frame.add(fSendB);
|
|
||||||
frame.add(myUserT);
|
frame.add(myUserT);
|
||||||
frame.add(connectB);
|
frame.add(connectB);
|
||||||
frame.setLayout(null);
|
frame.setLayout(null);
|
||||||
@ -113,10 +171,22 @@ public class App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
synchronized static byte[] convert(String wiad){
|
synchronized static byte[] convert(String wiad){
|
||||||
byte[] mess = new byte[1024];
|
byte[] mess = new byte[1024]; //UWAGA pewnie dluzsze wiadomosci trzeba jakos rozdzielac
|
||||||
//UWAGA pewnie dluzsze wiadomosci trzeba jakos rozdzielac
|
|
||||||
mess = wiad.getBytes(); // konwertujemy na bajty
|
mess = wiad.getBytes(); // konwertujemy na bajty
|
||||||
return mess;
|
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
|
@ -58,7 +58,7 @@ int main(void) {
|
|||||||
printf("Wysylam licznik\n");
|
printf("Wysylam licznik\n");
|
||||||
send(tGniazdo, tBufor, 1024, 0);
|
send(tGniazdo, tBufor, 1024, 0);
|
||||||
licznik += 1;
|
licznik += 1;
|
||||||
sleep(5);
|
sleep(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { //tutaj odbieram wiadomosci
|
} else { //tutaj odbieram wiadomosci
|
||||||
|
Loading…
Reference in New Issue
Block a user