From a3293212cb3bb60b8be4249117a054af8db8fedb Mon Sep 17 00:00:00 2001 From: Jakub Adamski Date: Mon, 11 Nov 2019 18:37:06 +0100 Subject: [PATCH] wreszcie dziala --- klient/Projekt-Final.jar | Bin 0 -> 5273 bytes klient/pom.xml | 74 ++++++------- klient/src/main/java/Projekt/App.java | 124 +++++++++++---------- server/server.c | 148 -------------------------- server/uberProstyServer.c | 65 +++++++++++ 5 files changed, 166 insertions(+), 245 deletions(-) create mode 100644 klient/Projekt-Final.jar create mode 100644 server/uberProstyServer.c diff --git a/klient/Projekt-Final.jar b/klient/Projekt-Final.jar new file mode 100644 index 0000000000000000000000000000000000000000..936cae9467a5324e1d0409dbb5c5633dd27214da GIT binary patch literal 5273 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 - - - - - maven-clean-plugin - 3.1.0 - - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.8.0 - - - maven-surefire-plugin - 2.22.1 - - - maven-jar-plugin - 3.0.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - - maven-site-plugin - 3.7.1 - - - maven-project-info-reports-plugin - 3.0.0 - - - + ${project.artifactId}-${project.version} + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + false + false + + + + Projekt.App + + + + + jar-with-dependencies + + + + + + + + diff --git a/klient/src/main/java/Projekt/App.java b/klient/src/main/java/Projekt/App.java index c4831b5..4bc8060 100644 --- a/klient/src/main/java/Projekt/App.java +++ b/klient/src/main/java/Projekt/App.java @@ -2,9 +2,7 @@ package Projekt; import javax.swing.DefaultListModel; import javax.swing.JButton; -import javax.swing.JComboBox; import javax.swing.JFrame; -import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTextField; import java.awt.event.*; @@ -18,34 +16,78 @@ Lepiej lapac exception!!! */ public class App { - static Socket socket; // przy evencie musi byc static albo w klasie musi byc final + static Socket tSocket; // 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 JButton mSendB, fSendB, connectB; static JList messagesL; - static DataOutputStream dos; - static DataInputStream dis; + static DataOutputStream tDos; static DefaultListModel messages = new DefaultListModel<>(); 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("Server IP"); + ipText = new JTextField("0.0.0.0"); ipText.setBounds(10, 10, 200, 30); - portText = new JTextField("Port"); + 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! + 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; + DataOutputStream rDos; + try { + InetAddress rAddr = InetAddress.getByName(ipText.getText()); + int rPort = Integer.parseInt(portText.getText()); + rSocket = new Socket(rAddr, rPort); // laczymy + rDis = new DataInputStream(rSocket.getInputStream()); // tu bedziemy przyjmowac wiadomosci + rDos = new DataOutputStream(rSocket.getOutputStream()); + rDos.write(convert("R")); //wysyƂamy znaczek R + ipText.setText("OK1"); + while (true) { + //czytamy wiadomosc + byte[] rec = new byte[1024]; + if (rDis.read(rec) > 0){ + String s = new String(rec); + //System.out.println("Serwer powiedzial: "+s); + messages.addElement(s); + messagesL.setModel(messages); + } + } + + } catch (Exception ae) { + ae.printStackTrace(); + ipText.setText("REC CANT CONNECT"); + } + return; + } + }; + + try { + receiveThread.start(); + //ustanawiamy polaczenie na wysylanie wiadomosci + InetAddress tAddr = InetAddress.getByName(ipText.getText()); + int tPort = Integer.parseInt(portText.getText()); + tSocket = new Socket(tAddr, tPort); // laczymy + tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci + tDos.write(convert("T")); //wysylamy T + portText.setText("OK2"); + + } catch (Exception ae){ + ae.printStackTrace(); + portText.setText("CANT CONNECT"); + } + } + }); myUserT = new JTextField("Nick"); myUserT.setBounds(10, 50, 100, 30); - usersL = new JLabel("Choose user:"); - usersL.setBounds(15, 90, 100, 30); - String users[] = { "Tomus", "Piotrus" }; - usersC = new JComboBox<>(users); - usersC.setBounds(110, 90, 100, 30); - messages.addElement(" Elo"); - messages.addElement(" No siema"); messagesL = new JList(messages); messagesL.setBounds(10, 130, 300, 150); messageT = new JTextField("Message"); @@ -53,28 +95,11 @@ public class App { mSendB = new JButton("Send"); mSendB.setBounds(55, 330, 100, 30); mSendB.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent e) { //wysylanie wiadomosci 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() + " " + messageT.getText())); //wysylamy messageT.setText(""); - //czytamy wiadomosc - byte[] rec = new byte[1024]; - dis.read(rec); - String s = new String(rec); - //System.out.println("Serwer powiedzial: "+s); - messages.addElement(s); - messagesL.setModel(messages); } catch (Exception e1) { messageT.setText("CANT SEND"); e1.printStackTrace(); @@ -87,30 +112,21 @@ public class App { frame.add(ipText); frame.add(portText); - frame.add(usersL); - frame.add(usersC); frame.add(messagesL); frame.add(messageT); frame.add(mSendB); frame.add(fSendB); 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; + } + } diff --git a/server/server.c b/server/server.c index 522bc44..e69de29 100644 --- a/server/server.c +++ b/server/server.c @@ -1,148 +0,0 @@ -#include -#include -#include -#include -#include -#include -#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, 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(44445); //port - adr.sin_addr.s_addr = INADDR_ANY; - - printf("Slucham na %s:%d\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port)); - - 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; - } - printf("Czekam na polaczenie ...\n"); - while ((gniazdo2 = accept(gniazdo, (struct sockaddr*) &nadawca, &dl)) > 0) { //odbieranie - memset(bufor, 0, 1024); - 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); - return 0; -} \ No newline at end of file diff --git a/server/uberProstyServer.c b/server/uberProstyServer.c new file mode 100644 index 0000000..7ed3bb6 --- /dev/null +++ b/server/uberProstyServer.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(void) { + char bufor[1024], rBufor[1024], tBufor[1024]; //wiadomosc + int gniazdo, gniazdo2, rGniazdo, tGniazdo; + struct sockaddr_in adr, nadawca, rNadawca, tNadawca; + socklen_t dl = sizeof(struct sockaddr_in); + + gniazdo = socket(PF_INET, SOCK_STREAM, 0); + adr.sin_family = AF_INET; + adr.sin_port = htons(44444); //port + adr.sin_addr.s_addr = INADDR_ANY; + + printf("Slucham na %s:%d\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port)); + + 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; + } + 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); + if (bufor[0] == 'T'){ + tGniazdo = gniazdo2; + tNadawca = nadawca; + if (fork() == 0){ //child wejdzie w while + while (1){ + memset(tBufor, 0, 1024); + recv(tGniazdo, tBufor, 1024, 0); + printf("Wiadomosc od %s: %s\n", inet_ntoa(tNadawca.sin_addr), tBufor); + } + } + } else { + rGniazdo = gniazdo2; + rNadawca = nadawca; + if(fork() == 0){ //child wejdzie w while + int licznik = 1; + while(1){ + memset(rBufor, 0, 1024); + rBufor[1] = licznik + '0'; + printf("Wysylam licznik\n"); + send(rGniazdo, rBufor, 1024, 0); + licznik += 1; + sleep(5); + } + } + } + close(gniazdo2); + } + close(gniazdo); + return 0; +} \ No newline at end of file