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
|
||||
|
||||
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>
|
||||
<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>
|
||||
|
@ -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
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user