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);