From 030fa4ef9839e9d0597a16ace121b24d7e9531f5 Mon Sep 17 00:00:00 2001 From: Jakub Adamski Date: Sun, 10 Nov 2019 13:45:49 +0100 Subject: [PATCH] server mod --- README.md | 19 +--- klient/src/main/java/Projekt/App.java | 98 +++++++++++++-------- server/server.c | 119 ++++++++++++++++++++++++-- 3 files changed, 176 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 7902a9b..c419d81 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,5 @@ # Projekt_SIK -Projekt 1 Sieci Komputerowe
-Wykorzystujemy protokol TCP!
+Serwer na zasadzie przesylania wiadomosci -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.
-Done: -* laczenie sie z pojedynczym klientem -* odbieranie wiadomosci tekstowych od jednego klienta i wyswietlanie je w konsoli - -TODO: -* polaczenie od wielu klientow -* odbieranie duzych plikow -* przekazywanie wiadomosci do klienta +Klient okresla do kogo ma wyslac diff --git a/klient/src/main/java/Projekt/App.java b/klient/src/main/java/Projekt/App.java index cd181c2..c4831b5 100644 --- a/klient/src/main/java/Projekt/App.java +++ b/klient/src/main/java/Projekt/App.java @@ -7,32 +7,43 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTextField; +import java.awt.event.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.net.InetAddress; +import java.net.Socket; + +/* +Lepiej lapac exception!!! +*/ + +public class App { + static Socket socket; // przy evencie musi byc static albo w klasie musi byc final + static JTextField ipText, portText, messageT, myUserT; + static JFrame frame = new JFrame("Messages"); + static JButton mSendB, fSendB; + static JLabel usersL; + static JComboBox usersC; + static JList messagesL; + static DataOutputStream dos; + static DataInputStream dis; + static DefaultListModel messages = new DefaultListModel<>(); -public class App -{ public static void main(String[] args) { - - JFrame frame = new JFrame("Messages"); - JTextField ipText, portText, messageT; - JButton connectB, mSendB, fSendB; - JLabel usersL; - JComboBox usersC; - JList messagesL; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(320,400); + frame.setSize(320, 400); - ipText = new JTextField("Server IP"); - ipText.setBounds(10,10, 200,30); + ipText = new JTextField("Server IP"); + ipText.setBounds(10, 10, 200, 30); portText = new JTextField("Port"); portText.setBounds(210, 10, 100, 30); - connectB = new JButton("Connect"); - connectB.setBounds(110, 50, 100, 30); + myUserT = new JTextField("Nick"); + myUserT.setBounds(10, 50, 100, 30); usersL = new JLabel("Choose user:"); - usersL.setBounds(10, 90, 200, 30); - String users[] = {"Tomus", "Piotrus"}; + usersL.setBounds(15, 90, 100, 30); + String users[] = { "Tomus", "Piotrus" }; usersC = new JComboBox<>(users); - usersC.setBounds(210, 90, 100, 30); - DefaultListModel messages = new DefaultListModel<>(); + usersC.setBounds(110, 90, 100, 30); messages.addElement(" Elo"); messages.addElement(" No siema"); messagesL = new JList(messages); @@ -41,41 +52,52 @@ public class App messageT.setBounds(10, 290, 300, 30); mSendB = new JButton("Send"); mSendB.setBounds(55, 330, 100, 30); + mSendB.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + InetAddress addr = InetAddress.getByName(ipText.getText()); + int port = Integer.parseInt(portText.getText()); + socket = new Socket(addr, port); // laczymy + dos = new DataOutputStream(socket.getOutputStream()); // tu wysylamy wiadomosci + dis = new DataInputStream(socket.getInputStream()); // tu bedziemy przyjmowac wiadomosci + + byte[] mess = new byte[1024]; + //UWAGA pewnie dluzsze wiadomosci trzeba jakos rozdzielac + String messS = myUserT.getText() + ">" + messageT.getText() + " #include +struct clients{ + char nick[30]; + char ip[30]; + unsigned short port; +}; + +int finduser(struct clients cli[], char name[]){ //zwraca na ktorym miejscu jest user, -1 jesli go nie ma + for (int i = 0; i < 10; i++){ + if (cli[i].nick[0] != '\0'){ //jesli cos juz zapisalismy + int ok = 1; + int j = 0; + while (cli[i].nick[j] != '\0'){ //dopoki nie ma konca + if (cli[i].nick[j] != name[j]){ //jesli sa rozne to przerywamy + ok = 0; + break; + } + j++; + } + if (ok){ //znalezlismy + return i; + } + } + } + return -1; +} + int main(void) { char bufor[1024]; //wiadomosc - int gniazdo, gniazdo2; - struct sockaddr_in adr, nadawca; + int gniazdo, gniazdo2, gniazdo3; //gniazda + struct sockaddr_in adr, nadawca, odbiorca; //nasz adres i adres do ktorego przesylamy wiadomosc + struct clients cli[10]; //maksymalnie 10 klientow + for(int i = 0; i < 10; i++){ //czyscimy zmienne w klientach + cli[i].port = 0; + for(int j = 0; j < 30; j++){ + cli[i].nick[j] = '\0'; + cli[i].ip[j] = '\0'; + } + } socklen_t dl = sizeof(struct sockaddr_in); + //nasze dane gniazdo = socket(PF_INET, SOCK_STREAM, 0); adr.sin_family = AF_INET; - adr.sin_port = htons(44444); //port + adr.sin_port = htons(44445); //port adr.sin_addr.s_addr = INADDR_ANY; printf("Slucham na %s:%d\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port)); @@ -30,8 +65,82 @@ int main(void) { printf("Czekam na polaczenie ...\n"); while ((gniazdo2 = accept(gniazdo, (struct sockaddr*) &nadawca, &dl)) > 0) { //odbieranie memset(bufor, 0, 1024); - recv(gniazdo2, bufor, 1024, 0); - printf("Wiadomosc od %s: %s\n", inet_ntoa(nadawca.sin_addr), bufor); + recv(gniazdo2, bufor, 1024, 0); //odbieramy + + //pobieramy dane uzytkownika + char name[30]; + char ip[30]; + unsigned short port = 0; + for (int i = 0; i < 30; i++){ //czyscimy + name[i] = '\0'; + ip[i] = '\0'; + } + int i = 0; + while (bufor[i] != '>'){ //> to jest nasz znak specjalny ktory konczy nazwe uzytkownika + name[i] = bufor[i]; + i++; + } + char *temp = inet_ntoa(nadawca.sin_addr); + size_t len = strlen(temp); + for (int i = 0; i < len; i++){ + ip[i] = temp[i]; + } + port = nadawca.sin_port; + printf("Wiadomosc od %s(%s:%i): %s\n", name, ip, port, bufor); + + //dodajemy go do listy + i = 0; + if (finduser(cli, name) == -1){ //jesli go jeszcze nie ma to doadajemy + while(1){ + if (i >= 10){ + printf("NIE MA DLA CIEBIE MIEJSCA\n"); + break; + } + if(cli[i].nick[0] == '\0'){ //mamy wolne miejsce + cli[i].port = port; + for(int j = 0; j < 30; j++){ + cli[i].nick[j] = name[j]; + cli[i].ip[j] = ip[j]; + } + break; + } + i++; + } + } + + //Znajdujemy do kogo przeslac wiadomosc + char nametosend[30]; + for (int j = 0; j < 30; j++){ //czyscimy + nametosend[j] = '\0'; + } + i = 0; + while(bufor[i] != '<'){ + i++; + } + int j = 0; + i++; + while(bufor[i] != '\0'){ + nametosend[j] = bufor[i]; + i++; + j++; + } + printf("Wiadomosc do %s \n", nametosend); + + //wydobywamy informacje z listy i wysylamy + int index = finduser(cli, nametosend); + + gniazdo3 = socket(PF_INET, SOCK_STREAM, 0); + odbiorca.sin_family = AF_INET; + odbiorca.sin_port = htons(cli[index].port); + odbiorca.sin_addr.s_addr = inet_addr(cli[index].ip); + if (connect(gniazdo3, (struct sockaddr*) &odbiorca, sizeof(odbiorca)) < 0) { + printf("Nawiazanie polaczenia nie powiodlo sie.\n"); + } + //GNIAZDO 2 TO WYSYLANIE WIAD TAM SKAD DOSTALISMY GNIAZDO 3 JAK BEDZIEMY MIELI 3 KOMPUTERY + //JAK USTAWIMY GNIAZDO 2 TO WYRZUCI BLAD ALE PRZESLE + send(gniazdo2, bufor, strlen(bufor), 0); + + close(gniazdo3); close(gniazdo2); } close(gniazdo);