server mod
This commit is contained in:
parent
a061c2dafd
commit
030fa4ef98
19
README.md
19
README.md
@ -1,20 +1,5 @@
|
|||||||
# Projekt_SIK
|
# Projekt_SIK
|
||||||
|
|
||||||
Projekt 1 Sieci Komputerowe <br>
|
Serwer na zasadzie przesylania wiadomosci
|
||||||
Wykorzystujemy protokol TCP! <br>
|
|
||||||
|
|
||||||
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 okresla do kogo ma wyslac
|
||||||
|
|
||||||
## 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:
|
|
||||||
* polaczenie od wielu klientow
|
|
||||||
* odbieranie duzych plikow
|
|
||||||
* przekazywanie wiadomosci do klienta
|
|
||||||
|
@ -7,32 +7,43 @@ import javax.swing.JFrame;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.JTextField;
|
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<String> usersC;
|
||||||
|
static JList<String> messagesL;
|
||||||
|
static DataOutputStream dos;
|
||||||
|
static DataInputStream dis;
|
||||||
|
static DefaultListModel<String> messages = new DefaultListModel<>();
|
||||||
|
|
||||||
public class App
|
|
||||||
{
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
JFrame frame = new JFrame("Messages");
|
|
||||||
JTextField ipText, portText, messageT;
|
|
||||||
JButton connectB, mSendB, fSendB;
|
|
||||||
JLabel usersL;
|
|
||||||
JComboBox<String> usersC;
|
|
||||||
JList<String> messagesL;
|
|
||||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
frame.setSize(320,400);
|
frame.setSize(320, 400);
|
||||||
|
|
||||||
ipText = new JTextField("Server IP");
|
ipText = new JTextField("Server IP");
|
||||||
ipText.setBounds(10,10, 200,30);
|
ipText.setBounds(10, 10, 200, 30);
|
||||||
portText = new JTextField("Port");
|
portText = new JTextField("Port");
|
||||||
portText.setBounds(210, 10, 100, 30);
|
portText.setBounds(210, 10, 100, 30);
|
||||||
connectB = new JButton("Connect");
|
myUserT = new JTextField("Nick");
|
||||||
connectB.setBounds(110, 50, 100, 30);
|
myUserT.setBounds(10, 50, 100, 30);
|
||||||
usersL = new JLabel("Choose user:");
|
usersL = new JLabel("Choose user:");
|
||||||
usersL.setBounds(10, 90, 200, 30);
|
usersL.setBounds(15, 90, 100, 30);
|
||||||
String users[] = {"Tomus", "Piotrus"};
|
String users[] = { "Tomus", "Piotrus" };
|
||||||
usersC = new JComboBox<>(users);
|
usersC = new JComboBox<>(users);
|
||||||
usersC.setBounds(210, 90, 100, 30);
|
usersC.setBounds(110, 90, 100, 30);
|
||||||
DefaultListModel<String> messages = new DefaultListModel<>();
|
|
||||||
messages.addElement("<USER> Elo");
|
messages.addElement("<USER> Elo");
|
||||||
messages.addElement("<YOU> No siema");
|
messages.addElement("<YOU> No siema");
|
||||||
messagesL = new JList<String>(messages);
|
messagesL = new JList<String>(messages);
|
||||||
@ -41,41 +52,52 @@ public class App
|
|||||||
messageT.setBounds(10, 290, 300, 30);
|
messageT.setBounds(10, 290, 300, 30);
|
||||||
mSendB = new JButton("Send");
|
mSendB = new JButton("Send");
|
||||||
mSendB.setBounds(55, 330, 100, 30);
|
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() + "<kubus";
|
||||||
|
mess = messS.getBytes(); // konwertujemy na bajty
|
||||||
|
dos.write(mess); //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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
fSendB = new JButton("File");
|
fSendB = new JButton("File");
|
||||||
fSendB.setBounds(165, 330, 100, 30);
|
fSendB.setBounds(165, 330, 100, 30);
|
||||||
|
|
||||||
|
|
||||||
frame.add(ipText);
|
frame.add(ipText);
|
||||||
frame.add(portText);
|
frame.add(portText);
|
||||||
frame.add(connectB);
|
|
||||||
frame.add(usersL);
|
frame.add(usersL);
|
||||||
frame.add(usersC);
|
frame.add(usersC);
|
||||||
frame.add(messagesL);
|
frame.add(messagesL);
|
||||||
frame.add(messageT);
|
frame.add(messageT);
|
||||||
frame.add(mSendB);
|
frame.add(mSendB);
|
||||||
frame.add(fSendB);
|
frame.add(fSendB);
|
||||||
|
frame.add(myUserT);
|
||||||
frame.setLayout(null);
|
frame.setLayout(null);
|
||||||
frame.setVisible(true);
|
frame.setVisible(true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
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]);
|
|
||||||
|
|
||||||
// utworz gniazdo i od razu podlacz je do addr:port
|
|
||||||
Socket socket = new Socket(addr, port);
|
|
||||||
|
|
||||||
//strumienie
|
|
||||||
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //tu wysylamy wiadomosci
|
|
||||||
DataInputStream dis = new DataInputStream(socket.getInputStream()); //tu bedziemy przyjmowac wiadomosci
|
|
||||||
|
|
||||||
//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
|
|
||||||
|
|
||||||
|
|
||||||
// czytaj odpowiedz to jest kod golinskiego
|
// czytaj odpowiedz to jest kod golinskiego
|
||||||
//String s = dis.readUTF();
|
//String s = dis.readUTF();
|
||||||
|
119
server/server.c
119
server/server.c
@ -6,15 +6,50 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
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) {
|
int main(void) {
|
||||||
char bufor[1024]; //wiadomosc
|
char bufor[1024]; //wiadomosc
|
||||||
int gniazdo, gniazdo2;
|
int gniazdo, gniazdo2, gniazdo3; //gniazda
|
||||||
struct sockaddr_in adr, nadawca;
|
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);
|
socklen_t dl = sizeof(struct sockaddr_in);
|
||||||
|
|
||||||
|
//nasze dane
|
||||||
gniazdo = socket(PF_INET, SOCK_STREAM, 0);
|
gniazdo = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
adr.sin_family = AF_INET;
|
adr.sin_family = AF_INET;
|
||||||
adr.sin_port = htons(44444); //port
|
adr.sin_port = htons(44445); //port
|
||||||
adr.sin_addr.s_addr = INADDR_ANY;
|
adr.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
printf("Slucham na %s:%d\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port));
|
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");
|
printf("Czekam na polaczenie ...\n");
|
||||||
while ((gniazdo2 = accept(gniazdo, (struct sockaddr*) &nadawca, &dl)) > 0) { //odbieranie
|
while ((gniazdo2 = accept(gniazdo, (struct sockaddr*) &nadawca, &dl)) > 0) { //odbieranie
|
||||||
memset(bufor, 0, 1024);
|
memset(bufor, 0, 1024);
|
||||||
recv(gniazdo2, bufor, 1024, 0);
|
recv(gniazdo2, bufor, 1024, 0); //odbieramy
|
||||||
printf("Wiadomosc od %s: %s\n", inet_ntoa(nadawca.sin_addr), bufor);
|
|
||||||
|
//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(gniazdo2);
|
||||||
}
|
}
|
||||||
close(gniazdo);
|
close(gniazdo);
|
||||||
|
Loading…
Reference in New Issue
Block a user