release candidate
This commit is contained in:
parent
b3af790b84
commit
1039e80b3b
Binary file not shown.
@ -77,20 +77,20 @@ public class App {
|
||||
myUserT.setBounds(10, 50, 100, 30);
|
||||
messagesL = new JList<String>(messages);
|
||||
sPane = new JScrollPane(messagesL);
|
||||
sPane.setBounds(10, 130, 300, 150);
|
||||
sPane.setBounds(10, 100, 300, 180);
|
||||
messageT = new JTextField("Message");
|
||||
messageT.setBounds(10, 290, 300, 30);
|
||||
mSendB = new JButton("Send");
|
||||
mSendB.setBounds(55, 330, 100, 30);
|
||||
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;
|
||||
DataInputStream tDis;
|
||||
Socket tSocket;
|
||||
DataOutputStream tDos, fDos;
|
||||
DataInputStream fDis;
|
||||
Socket tSocket, fSocket;
|
||||
String toCheckString = messString + "xdddddddd"; //sprawdzany string zawsze bedzie mial min 9 znakow
|
||||
|
||||
if (toCheckString.substring(0, 5).equals("/FILE")){ //CHYBA OK? wysylanie pliku
|
||||
@ -104,35 +104,44 @@ public class App {
|
||||
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
|
||||
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
|
||||
byte[] bufor = new byte[1024];
|
||||
System.arraycopy(fileContent, wyslano, bufor, 0, 1024);
|
||||
tDos.write(bufor); //uwaga dodac sprawdzanie czy na pewno wyslalismy dobra liczbe bajtow
|
||||
int tobyte = 1024; //standardowa ilosc bajtow
|
||||
if (wyslano + tobyte > fileContent.length){
|
||||
tobyte = fileContent.length - wyslano;
|
||||
}
|
||||
System.arraycopy(fileContent, wyslano, bufor, 0, tobyte);
|
||||
fDos.write(bufor); //uwaga dodac sprawdzanie czy na pewno wyslalismy dobra liczbe bajtow
|
||||
wyslano += 1024;
|
||||
addMessage("WYSLANO: " + wyslano);
|
||||
}
|
||||
messageT.setText("");
|
||||
tSocket.close(); //czy to tez trzeba?
|
||||
fSocket.close(); //czy to tez trzeba?
|
||||
}
|
||||
|
||||
} else if(toCheckString.substring(0, 9).equals("/DOWNLOAD")) { //pobieranie pliku
|
||||
tSocket = new Socket(tAddr, tPort); // laczymy
|
||||
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
||||
tDis = new DataInputStream(tSocket.getInputStream()); //tu przyjmujemy wiadomosci
|
||||
tDos.write(convert(myUserT.getText() + "> DOWNLOAD:" + messString.substring(1, messString.length()))); //wysylamy prosbe
|
||||
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 (tDis.read(rec) > 0){
|
||||
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)){ //pobieramy zawartosc pliku
|
||||
while (received < Integer.parseInt(s.trim())){ //pobieramy zawartosc pliku
|
||||
rec = new byte[1024]; //czyscimy tablice
|
||||
if (tDis.read(rec) > 0){
|
||||
if (fDis.read(rec) > 0){
|
||||
fileBList.add(rec); //dodajemy do listy
|
||||
}
|
||||
received += 1024;
|
||||
|
333
server/server.c
333
server/server.c
@ -0,0 +1,333 @@
|
||||
#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 <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
struct client_socket
|
||||
{
|
||||
//Do Dodania:
|
||||
//Wiadomosci dla kazdego uzytkownika
|
||||
//sockety do recv dla kazdego uzytkownika?
|
||||
int socket;
|
||||
int socket_recv;
|
||||
struct sockaddr_in accept_adr;
|
||||
struct sockaddr_in recv_adr;
|
||||
char msg[1024];
|
||||
fd_set Client;
|
||||
fd_set Client2;
|
||||
char Ip[40];
|
||||
|
||||
};
|
||||
|
||||
int main(void) {
|
||||
//ZMIENNE
|
||||
struct sockaddr_in bind_adr; //Glówny socket adres
|
||||
struct sockaddr_in recv_adr;
|
||||
struct sockaddr_in accept_temp_adr; //
|
||||
struct sockaddr_in pliki_adr;
|
||||
int pliki_socket;
|
||||
int socket_bind; //Główny socket
|
||||
int socket_recv;
|
||||
int accept_recv;
|
||||
int accept_temp;
|
||||
char msg[1024] = "Puste";
|
||||
char msg_copy[1024];
|
||||
struct client_socket client[7]; //Tablica Klientów
|
||||
fd_set Socket; //Zbiór jednego deskryptora - głównego socketa
|
||||
fd_set Recv;
|
||||
socklen_t dl = sizeof(struct sockaddr_in); //Wielkość struktury
|
||||
int i; //licznik
|
||||
int j; //licznik
|
||||
struct timeval timeout; //Po ilu sekundach select odpuści
|
||||
timeout.tv_sec = 1;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
//ZMIENNE DO WYSYLANIA PLIKOW
|
||||
FILE* plik;
|
||||
long read_plik;
|
||||
long send_plik;
|
||||
long wielkosc;
|
||||
long razem;
|
||||
int pliki_accept;
|
||||
struct stat file_info;
|
||||
char* token1;
|
||||
char* token2;
|
||||
char* token3;
|
||||
char* token4;
|
||||
|
||||
//INICJALIZACJA: Tablica Klientów
|
||||
for(i=0; i<=4; i++){
|
||||
client[i].socket = 0;
|
||||
strcpy(client[i].msg,"/EMPTY");
|
||||
}
|
||||
printf("INICJALIZACJA: Tablica Klientow\n");
|
||||
|
||||
|
||||
|
||||
//INICJALIZACJA: Socket
|
||||
socket_bind = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(socket_bind < 0) {
|
||||
printf("Error: Socket\n");
|
||||
return 1;
|
||||
}
|
||||
printf("INICJALIZACJA: Socket\n");
|
||||
|
||||
socket_recv = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(socket_recv < 0) {
|
||||
printf("Error: Socket_Accept\n");
|
||||
return 1;
|
||||
}
|
||||
printf("INICJALIZACJA: Socket_Accept\n");
|
||||
|
||||
pliki_socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (pliki_socket < 0) {
|
||||
printf("Error: Socket_Pliki\n");
|
||||
return 1;
|
||||
}
|
||||
//INICJALIZACJA: Adres
|
||||
bind_adr.sin_family = AF_INET;
|
||||
bind_adr.sin_port = htons(44445);
|
||||
bind_adr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
recv_adr.sin_family = AF_INET;
|
||||
recv_adr.sin_port = htons(44444);
|
||||
recv_adr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
pliki_adr.sin_family = AF_INET;
|
||||
pliki_adr.sin_port = htons(44446);
|
||||
pliki_adr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
//INICJALIZACJA: Bind
|
||||
if (bind(socket_bind, (struct sockaddr*) &bind_adr, sizeof(bind_adr)) < 0){
|
||||
printf("Error: Bind\n");
|
||||
return 1;
|
||||
}
|
||||
printf("INICJALIZACJA: Bind\n");
|
||||
|
||||
if(bind(socket_recv, (struct sockaddr*)&recv_adr, sizeof(recv_adr)) < 0) {
|
||||
printf("Error: Bind Recv\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(bind(pliki_socket, (struct sockaddr*)&pliki_adr, sizeof(pliki_adr)) < 0) {
|
||||
printf("Error: Bind Pliki\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
//INICJALIZACJA: Listen
|
||||
if (listen(socket_bind, 10) < 0) {
|
||||
printf("Error: Listen\n");
|
||||
return 1;
|
||||
}
|
||||
printf("INICJALIZACJA: Listen\n");
|
||||
|
||||
if(listen(socket_recv, 10) < 0) {
|
||||
printf("Error: Listen Recv\n");
|
||||
}
|
||||
|
||||
if(listen(pliki_socket, 10) < 0) {
|
||||
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;
|
||||
timeout.tv_usec = 0;
|
||||
//INICJALIZACJA: Zbiór Deskryptorów
|
||||
FD_ZERO(&Socket);
|
||||
FD_ZERO(&Recv);
|
||||
FD_SET(socket_bind, &Socket);
|
||||
FD_SET(socket_recv, &Recv);
|
||||
|
||||
|
||||
//SELECT - Sprawdzanie nowych połączeń
|
||||
//Select sprawdza czy można na socketcie wykonać jakiś accept - sprawdza czy ktoś się chce połączyć
|
||||
if(select(socket_bind+1, &Socket, NULL, NULL, &timeout) > 0) {
|
||||
printf("Wykryto polaczenie\n");
|
||||
if (FD_ISSET(socket_bind, &Socket)) {
|
||||
//printf("Rozpoczynam accept\n");
|
||||
//Sprawdzenie na które miejsce w tablicy dopisać nowy gniazdo
|
||||
accept_temp = accept(socket_bind,(struct sockaddr*)&accept_temp_adr, &dl);
|
||||
//Sprawdzamy czy istnieje takie ip już
|
||||
//Jeśli tak to odbierz wiadomość
|
||||
//Porównaj wiadomość i zapisz na odpowiednim miejscu
|
||||
//Jeśli nie to wstaw go w nastepne wolne miejsce
|
||||
i = 0;
|
||||
while(i<=4){
|
||||
if (client[i].socket == 0){
|
||||
//printf("%s\n", inet_ntoa(temp_accept_adr.sin_addr));
|
||||
client[i].socket = accept_temp;
|
||||
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));
|
||||
i++;
|
||||
break;
|
||||
} else {
|
||||
printf("Miejsce %i zajęte\n", i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//ZBIERANIE WIADOMOSCI
|
||||
//Przejrzymy całą tablicę klientów i z tych połączonych zbierzemy ich wysłane wiadomosci
|
||||
if(select(socket_recv+1, &Recv, NULL, NULL, &timeout) > 0) {
|
||||
printf("Wykryto wiadomosc\n");
|
||||
accept_recv = accept(socket_recv, (struct sockaddr*)&recv_adr, &dl);
|
||||
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");
|
||||
strcpy(msg_copy, msg);
|
||||
printf("Kopia: %s\n", msg_copy);
|
||||
printf("Tok1\n");
|
||||
token1 = strtok(msg_copy, " ");
|
||||
printf("Tok2\n");
|
||||
token2 = strtok(NULL, " ");
|
||||
printf("Tok3\n");
|
||||
token3 = strtok(NULL, " ");
|
||||
printf("Tok4\n");
|
||||
token4 = strtok(NULL, " ");
|
||||
printf("Wiadomosc od %s: %s\n",inet_ntoa(recv_adr.sin_addr), msg);
|
||||
//porównuj po drugim tokenie
|
||||
if(token2 == NULL) {
|
||||
token2 = "Brak";
|
||||
}
|
||||
if (strcmp(token2, "/EXIT") == 0) {
|
||||
printf("Odebrano /EXIT\n");
|
||||
printf("token1:%s\n", token1);
|
||||
printf("token2:%s\n", token2);
|
||||
printf("token3:%s\n", token3);
|
||||
printf("token4:%s\n", token4);
|
||||
|
||||
i = 0;
|
||||
while(i<=4) {
|
||||
if(strcmp(client[i].Ip, inet_ntoa(recv_adr.sin_addr)) == 0) {
|
||||
printf("Użytkownik %i wyszedł\n", i);
|
||||
close(client[i].socket);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} else if (strcmp(token2, "/DOWNLOAD") == 0){
|
||||
printf("Odebrano /DOWNLOAD\n");
|
||||
printf("token1:%s\n", token1);
|
||||
printf("token2:%s\n", token2);
|
||||
printf("token3:%s\n", token3);
|
||||
printf("token4:%s\n", token4);
|
||||
if(fork() == 0) {
|
||||
pliki_accept = accept(pliki_socket, (struct sockaddr*)&pliki_adr, &dl);
|
||||
if(token3 != NULL) {
|
||||
|
||||
if(stat(token3, &file_info) < 0) {
|
||||
printf("Brak informacji o pliku");
|
||||
wielkosc = 0;
|
||||
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
|
||||
plik = fopen(token3, "rb");
|
||||
razem = 0;
|
||||
while(razem < wielkosc) {
|
||||
read_plik = fread(msg, 1, 1024, plik);
|
||||
send_plik = send(pliki_accept, msg, read_plik, 0);
|
||||
if (read_plik != send_plik) {
|
||||
break;
|
||||
}
|
||||
razem += send_plik;
|
||||
}
|
||||
|
||||
fclose(plik);
|
||||
}
|
||||
close(pliki_accept);
|
||||
exit(0);
|
||||
} else {
|
||||
printf("Niepoprawna wiadomosc\n");
|
||||
wielkosc = 0;
|
||||
wielkosc = htonl(wielkosc);
|
||||
send(pliki_accept, &wielkosc, sizeof(long), 0);
|
||||
close(pliki_accept);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
} else if (strcmp(token2, "/FILE") == 0) {
|
||||
printf("Odebrano /FILE\n");
|
||||
printf("token1:%s\n", token1);
|
||||
printf("token2:%s\n", token2);
|
||||
printf("token3:%s\n", token3);
|
||||
printf("token4:%s\n", token4);
|
||||
|
||||
if(fork() == 0) {
|
||||
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
|
||||
printf("Błąd pobierania\n");
|
||||
} else {
|
||||
razem = 0;
|
||||
plik = fopen(token3, "wb");
|
||||
while(razem < wielkosc) {
|
||||
read_plik = recv(pliki_accept, msg, 1024, 0); //read_plik = recv(pliki_socket, msg, 1024, 0); KUBA
|
||||
if(read_plik < 0) {
|
||||
break;
|
||||
}
|
||||
fwrite(msg, 1, 1024, plik);
|
||||
razem += read_plik;
|
||||
}
|
||||
fclose(plik);
|
||||
}
|
||||
close(pliki_accept);
|
||||
exit(0);
|
||||
} else {
|
||||
printf("Niepoprawna komenda\n");
|
||||
close(pliki_accept);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
//fork
|
||||
//accept
|
||||
//Sprawdz wielkosc pliku
|
||||
//Odbierz plik
|
||||
//close(pliki_accept)
|
||||
} else {
|
||||
printf("Wysyłanie wiadomosci\n");
|
||||
printf("token1:%s\n", token1);
|
||||
printf("token2:%s\n", token2);
|
||||
printf("token3:%s\n", token3);
|
||||
printf("token4:%s\n", token4);
|
||||
|
||||
i = 0;
|
||||
//Sprawdz kto jest podlaczony
|
||||
while(i<=4) {
|
||||
if(client[i].socket != 0) {
|
||||
//Wyslij wiadowmosc
|
||||
send(client[i].socket, msg, 1024, 0);
|
||||
printf("Send wysłany");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
close(accept_recv);
|
||||
}
|
||||
}//while
|
||||
printf("------------------------------------------------Koniec??\n");
|
||||
}//main
|
Loading…
Reference in New Issue
Block a user