Compare commits

..

17 Commits

Author SHA1 Message Date
adam 4ff56f2636 comit 2019-11-23 15:51:43 +01:00
adam 3010b45e05 Comit - Wiosenne porządki 2019-11-10 19:20:56 +01:00
adam 590ad72d9b Commit 2019-11-10 02:27:06 +01:00
Adam Toppmayer dab08afc82 Zaktualizuj 'server/server.c' 2019-11-09 22:57:04 +00:00
adam a4c9d7c72e Merge branch 'master' of https://git.wmi.amu.edu.pl/s444496/Projekt_SIK 2019-11-09 23:49:12 +01:00
adam 8b50fe95b9 Merge? 2019-11-09 23:48:45 +01:00
adam fb938341f1 Merge? 2019-11-09 23:46:08 +01:00
Adam Toppmayer 1ef8745451 Zaktualizuj 'server/server.c' 2019-11-09 22:42:58 +00:00
Adam Toppmayer 8c7115ef7b Zaktualizuj 'server/server.c' 2019-11-09 22:30:02 +00:00
adam 120a454d9d commit 2019-11-09 22:39:59 +01:00
Adam Toppmayer 2a468af441 Zaktualizuj 'server/server.c' 2019-11-09 20:30:49 +00:00
Adam Toppmayer 4c84927fd4 Zaktualizuj 'server/server.c' 2019-11-09 16:46:05 +00:00
Adam Toppmayer f9d2f53d81 Zaktualizuj 'server/server.c' 2019-11-09 16:34:44 +00:00
Adam Toppmayer b3e7938dc4 Zaktualizuj 'server/server.c' 2019-11-05 19:48:03 +00:00
Adam Toppmayer e6a7ebefc3 Zaktualizuj 'server/server.c' 2019-11-05 17:54:11 +00:00
Adam Toppmayer 86bc60b23a Zaktualizuj 'server/server.c' 2019-11-02 22:04:47 +00:00
Adam Toppmayer 30c3f77afa Zaktualizuj 'server/server.c' 2019-11-01 17:34:46 +00:00
8 changed files with 98 additions and 354 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -1,25 +1,20 @@
# Projekt_SIK
Serwer na zasadzie przesylania wiadomosci
Projekt 1 Sieci Komputerowe <br>
Wykorzystujemy protokol TCP! <br>
Klient okresla do kogo ma wyslac
W gitignore dodalem pliki ktore nie maja byc przesylane na repozytorium. U mnie sa to smieci produkowane z Visual Studio Code oraz folder target z javy - tam jest generowany plik jar przez maven (jak zrobi sie maven install), mozna to robic lokalnie, nie trzeba przesylac na repozytorium. Dodatkowo nie przesylamy skompilowanego pliku z C czyli server/server.
## klient
W javie. Wykorzystalem to narzedzie maven, na Inzynierii oprogramowania je uruchomil. W skrocie sluzy do tego zebysmy potem mogli ladnie wyeksportowac plik javy do jednego pliku ktory mozemy uruchomic - takie narzedzie co kompiluje nam jave pozniej. Caly kod jest w App.java, wysylanie wiadomosci dziala - uwaga na wielkosc wiadomosci - te bajty. Bedziemy musieli chyba zrobic tak ze wiadomosci tekstowe sa rozdzielane na takie segmenty odpowiedniej wielkosci zeby pozniej je ladnie wyslac bo niestety C w ktorym jest napisany serwer musi miec dokladnie okreslona wielkosc odbieranej wiadomosci.
## serwer
W C. <br>
Done:
* laczenie sie z pojedynczym klientem
* odbieranie wiadomosci tekstowych od jednego klienta i wyswietlanie je w konsoli
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
/Users/kuba/Desktop/vid.mov
* polaczenie od wielu klientow
* odbieranie duzych plikow
* przekazywanie wiadomosci do klienta

Binary file not shown.

View File

@ -24,53 +24,51 @@
<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>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<attach>false</attach>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>
Projekt.App
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -1,201 +1,41 @@
package Projekt;
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 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, connectB;
static JList<String> messagesL;
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;
}
};
import java.io.*;
import java.net.*;
public class App
{
public static void main(String[] args) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(320, 400);
ipText = new JTextField("0.0.0.0");
ipText.setBounds(10, 10, 200, 30);
portText = new JTextField("44444");
portText.setBounds(210, 10, 100, 30);
connectB = new JButton("Connect");
connectB.setBounds(110, 50, 100, 30);
connectB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
//zapobiegac podwojnemu kliknieciu w connect!
receiveThread.start();
}
});
try {
// USTALAMY adres serwera i port - trzeba wpisac to co wyrzuca po uruchomieniu serwer
InetAddress addr = InetAddress.getByName("0.0.0.0");
int port = 44444; //Integer.parseInt(args[1]);
myUserT = new JTextField("Nick");
myUserT.setBounds(10, 50, 100, 30);
messagesL = new JList<String>(messages);
sPane = new JScrollPane(messagesL);
sPane.setBounds(10, 100, 300, 180);
messageT = new JTextField("Message");
messageT.setBounds(10, 290, 300, 30);
mSendB = new JButton("Send");
mSendB.setBounds(110, 330, 100, 30);
mSendB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { //wysylanie wiadomosci
try {
InetAddress tAddr = InetAddress.getByName(ipText.getText()); //ustanawiamy polaczenie na wysylanie wiadomosci
int tPort = Integer.parseInt(portText.getText());
String messString = messageT.getText();
DataOutputStream tDos, fDos;
DataInputStream fDis;
Socket tSocket, fSocket;
String toCheckString = messString + "xdddddddd"; //sprawdzany string zawsze bedzie mial min 9 znakow
// utworz gniazdo i od razu podlacz je do addr:port
Socket socket = new Socket(addr, port);
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
tSocket.close();
fSocket = new Socket(tAddr, tPort + 2);
fDos = new DataOutputStream(fSocket.getOutputStream()); //polaczenie dla pliku
int wyslano = 0;
while (wyslano < sendFile.length()){ //wysylamy po 1024
int tobyte = 1024; //standardowa ilosc bajtow
if (wyslano + tobyte > fileContent.length){
tobyte = fileContent.length - wyslano;
}
byte[] bufor = new byte[tobyte];
System.arraycopy(fileContent, wyslano, bufor, 0, tobyte);
fDos.write(bufor); //uwaga dodac sprawdzanie czy na pewno wyslalismy dobra liczbe bajtow
wyslano += tobyte;
addMessage("WYSLANO: " + wyslano);
}
messageT.setText("");
fSocket.close(); //czy to tez trzeba?
}
//strumienie
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //tu wysylamy wiadomosci
DataInputStream dis = new DataInputStream(socket.getInputStream()); //tu bedziemy przyjmowac wiadomosci
} else if(toCheckString.substring(0, 9).equals("/DOWNLOAD")) { //pobieranie pliku
tSocket = new Socket(tAddr, tPort); // laczymy
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
tDos.write(convert(myUserT.getText() + "> /DOWNLOAD " + messString.substring(10, messString.length()))); //wysylamy prosbe
fSocket = new Socket(tAddr, tPort + 2);
fDis = new DataInputStream(fSocket.getInputStream());
byte[] rec = new byte[1024];
String s = new String();
if (fDis.read(rec) > 0){
s = new String(rec); //otrzymana wiadomosc o wielkosci pliku
System.out.println(s);
}
int received = 0;
List<byte[]> fileBList = new ArrayList<byte[]>(); //plik
while (received < Integer.parseInt(s.trim())){ //pobieramy zawartosc pliku
rec = new byte[1024]; //czyscimy tablice
if (fDis.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();
addMessage("CANT SEND");
}
}
});
//wiadomosc musimy stworzyc tak zeby miala 1024 bajty - tak zeby pasowala do tablicy charow z serwera!
byte[] mess = new byte[1024];
String str = "Hello world from java!";
mess = str.getBytes(); //konwertujemy na bajty
dos.write(mess); //wysylamy
frame.add(ipText);
frame.add(portText);
frame.add(sPane);
frame.add(messageT);
frame.add(mSendB);
frame.add(myUserT);
frame.add(connectB);
frame.setLayout(null);
frame.setVisible(true);
// czytaj odpowiedz to jest kod golinskiego
//String s = dis.readUTF();
// wypisz odpowiedz
//System.out.println("Serwer powiedzial: "+s);
dis.close();
dos.close();
socket.close();
} catch (Exception e) { //kiepskie lapanie wyjatkow!! lepiej bardziej sprecyzowac jaki wyjatek lapiemy
e.printStackTrace();
}
System.out.println("Klient zakonczyl dzialanie");
}
synchronized static byte[] convert(String wiad){
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

BIN
server/.DS_Store vendored

Binary file not shown.

View File

@ -37,7 +37,6 @@ int main(void) {
int socket_recv;
int accept_recv;
int accept_temp;
unsigned char buff[1024];
char msg[1024] = "Puste";
char msg_copy[1024];
struct client_socket client[7]; //Tablica Klientów
@ -137,9 +136,6 @@ int main(void) {
printf("Error: Listen Pliki \n");
}
printf("Zaczynam Nasłuchiwanie...\n");
printf("Bazowy na %s:%d\n", inet_ntoa(recv_adr.sin_addr), ntohs(recv_adr.sin_port)); //DODALEM KUBA
//NASŁUCHIWANIE KLIENTÓW
while (1) {
timeout.tv_sec = 1;
@ -171,7 +167,7 @@ int main(void) {
client[i].accept_adr = accept_temp_adr;
FD_SET(client[i].socket, &client[i].Client);
printf("Dodano użytkownika %s na miejscu %i\n", inet_ntoa(client[i].accept_adr.sin_addr), i);
strcpy(client[i].Ip, inet_ntoa(client[i].accept_adr.sin_addr));
//strcpy(client[i].Ip, inet_ntoa(client[i].accept_adr.sin_addr));
i++;
break;
} else {
@ -189,8 +185,6 @@ int main(void) {
if(select(socket_recv+1, &Recv, NULL, NULL, &timeout) > 0) {
printf("Wykryto wiadomosc\n");
accept_recv = accept(socket_recv, (struct sockaddr*)&recv_adr, &dl);
memset(msg, 0, 1024);
memset(msg_copy, 0, 1024);
if(recv(accept_recv, msg, 1024, 0) > 0) {
//Sklonuj msg i tokenizuj trzy pierwsze słowa (1.user> 2.Down/upload 3.Sciezka do pliku)
printf("Zaczynam Kopiowac\n");
@ -221,7 +215,6 @@ int main(void) {
if(strcmp(client[i].Ip, inet_ntoa(recv_adr.sin_addr)) == 0) {
printf("Użytkownik %i wyszedł\n", i);
close(client[i].socket);
client[i].socket = 0;
}
i++;
}
@ -241,15 +234,12 @@ int main(void) {
wielkosc = htonl(wielkosc);
send(pliki_accept, &wielkosc, sizeof(long), 0);
} else {
wielkosc = (long) file_info.st_size; //wielkosc = htonl((long) file_info.st_size); KUBA
memset(msg, 0, 1024); //DODANE KUBA
snprintf(msg, 1024, "%li", wielkosc); //DODALEM KUBA
send(pliki_accept, &msg, sizeof(long), 0); //KUBA
// wielkosc = file_info.st_size; USUNIETE KUBA
wielkosc = htonl((long) file_info.st_size);
send(pliki_accept, &wielkosc, sizeof(long), 0);
wielkosc = file_info.st_size;
plik = fopen(token3, "rb");
razem = 0;
while(razem < wielkosc) {
memset(msg, 0, 1024);
read_plik = fread(msg, 1, 1024, plik);
send_plik = send(pliki_accept, msg, read_plik, 0);
if (read_plik != send_plik) {
@ -282,20 +272,18 @@ int main(void) {
pliki_accept = accept(pliki_socket, (struct sockaddr*)&pliki_adr, &dl);
if(token3 != NULL && token4 != NULL) {
//recv(pliki_socket, &wielkosc, sizeof(long), 0);
char *eptr; //KUBA
wielkosc = strtol(token4, &eptr, 10); //wielkosc = (long) token4; KUBA
if(wielkosc <= 0) { //if(wielkosc = ntohl(wielkosc) <= 0) { KUBA
wielkosc = (long) token4;
if(wielkosc = ntohl(wielkosc) <= 0) {
printf("Błąd pobierania\n");
} else {
razem = 0;
plik = fopen(token3, "wb");
while(razem < wielkosc) {
memset(msg, 0, 1024);
read_plik = recv(pliki_accept, msg, 1024, 0); //read_plik = recv(pliki_socket, msg, 1024, 0); KUBA
read_plik = recv(pliki_socket, msg, 1024, 0);
if(read_plik < 0) {
break;
}
fwrite(msg, 1, read_plik, plik);
fwrite(msg, 1, 1024, plik);
razem += read_plik;
}
fclose(plik);
@ -336,4 +324,4 @@ int main(void) {
}
}//while
printf("------------------------------------------------Koniec??\n");
}//main
}//main

View File

@ -1,77 +0,0 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <unistd.h>
int main(void) {
char bufor[1024], rBufor[1024], tBufor[1024]; //wiadomosc
int gniazdo, gniazdo2, rGniazdo, tGniazdo;
struct sockaddr_in adr, rNadawca, tNadawca, adrS;
socklen_t dl = sizeof(struct sockaddr_in);
gniazdo = socket(PF_INET, SOCK_STREAM, 0);
gniazdo2 = socket(PF_INET, SOCK_STREAM, 0);
//adres do odbierania widomosci od klienta
adr.sin_family = AF_INET;
adr.sin_port = htons(44444); //port
adr.sin_addr.s_addr = INADDR_ANY;
//adres do wysylania widomosci do klienta
adrS.sin_family = AF_INET;
adrS.sin_port = htons(44445); //port
adrS.sin_addr.s_addr = INADDR_ANY;
printf("Odbieram na %s:%d\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port));
printf("Wysylam na %s:%d\n", inet_ntoa(adrS.sin_addr), ntohs(adrS.sin_port));
//konfiguracja do odbierania wiadomosci
if (bind(gniazdo, (struct sockaddr*) &adr, sizeof(adr)) < 0) { //bind
printf("Bind nie powiodl sie.\n");
return 1;
}
if (listen(gniazdo, 10) < 0) { //listen
printf("Listen nie powiodl sie.\n");
return 1;
}
//konfiguracja do wysylania wiadomosci
if (bind(gniazdo2, (struct sockaddr*) &adrS, sizeof(adrS)) < 0) { //bind
printf("Bind nie powiodl sie.\n");
return 1;
}
if (listen(gniazdo2, 10) < 0) { //listen
printf("Listen nie powiodl sie.\n");
return 1;
}
printf("Polaczenia skonfigurowane ...\n");
if (fork() == 0){ //child wejdzie w to TUTAJ WYSYLAM WIDOMOSCI co 5 sekund
while ((tGniazdo = accept(gniazdo2, (struct sockaddr*) &tNadawca, &dl)) > 0) {
int licznik = 1;
while(1){
memset(tBufor, 0, 1024);
tBufor[1] = licznik + '0';
printf("Wysylam licznik\n");
send(tGniazdo, tBufor, 1024, 0);
licznik += 1;
sleep(3);
}
}
} else { //tutaj odbieram wiadomosci
while ((rGniazdo = accept(gniazdo, (struct sockaddr*) &rNadawca, &dl)) > 0) { //odbieranie
memset(rBufor, 0, 1024);
recv(rGniazdo, rBufor, 1024, 0);
printf("Wiadomosc od %s: %s\n", inet_ntoa(rNadawca.sin_addr), rBufor);
close(rGniazdo);
}
}
//do tego w sumie nigdy nie dojdziemy
close(gniazdo2);
close(gniazdo);
return 0;
}