Witam
Potrzebuje zrobić aplikację klient-serwer w javie. Ma ona wyszukiwać pliki w podanym na serwerze folderze, porównywać czy plik x na serwerze jest taki sam jak u klienta. Mam dużo więcej do zrobienia ale od czegoś trzeba zacząć. Jakby ktoś mógł mi pomóc byłbym wdzięczny :)
Największy problem mam ze zrobieniem tego by połączyć klienta, serwer z funkcją robienia kopii danych
pierwszy jest serwer:
import java.net.*;
import java.io.*;
import java.util.*;
public class ObjectServer {
ServerSocket gniazdo;
public ObjectServer(int port){
System.out.println("Próbuję połączyć się z portem"+port);
try{
gniazdo = new ServerSocket(port);
}
catch (Exception e) {
System.out.println("Wyjątek: "+ e);
System.exit(1);
}
}
public static void main(String[] args) {
int port=3245;
if (args.length > 0){
try{
port = Integer.parseInt(args[0]);
}
catch (Exception e){
port = 3245;
}
}
ObjectServer server = new ObjectServer(port);
System.out.println("Serwer działa na porcie nr: "+ port);
server.dzialaj();
}
public void dzialaj(){
try{
System.out.println("Oczekuje na połączenie z użytkownikiem...");
while(true) {
Socket gniazdoReq = gniazdo.accept();
System.out.println("Połączyłem się z: " + gniazdoReq.getInetAddress().getHostName());
serviceClient(gniazdoReq);
}
}
catch(IOException e){
System.out.println("Wyjątek: "+e);
}
}
public void serviceClient(Socket s) {
ObjectOutputStream outStream; //referencja do strumienia wyjs´ciowego, przez który wysyłane sa˛ dane
ObjectInputStream inStream;
try {
outStream = new ObjectOutputStream(s.getOutputStream());
inStream = new ObjectInputStream(s.getInputStream());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
teraz client:
import java.io.*;
import java.net.*;
import java.util.*;
public class ObjectClient {
Socket gniazdo;
ObjectInputStream inStream = null;
ObjectOutputStream outStream = null;
public ObjectClient(String host, int port) throws
UnknownHostException, IOException {
gniazdo = new Socket(host, port);
outStream = new ObjectOutputStream( gniazdo.getOutputStream());
inStream = new ObjectInputStream(gniazdo.getInputStream());
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean finished = false;
try {
ObjectClient client = new ObjectClient("192.168.2.101", 3245);
System.out.println("Podaj numer karty: ");
}
catch (Exception e) {
System.out.println ("Wyjątek : " + e);
e.printStackTrace();
}
}
}
jest to serwer i klient i to mi działa, tzn klient łączy się z serwerem, ale ma jeszcze plik skopiować, tzn zrobić kopie zapasową i to ma być na serwerze obsługiwać ma to klient. Mam nadzieje że się dobrze wyraziłem o co mi chodzi
zapomniałem dodać kod
kod robienia kopii zapasowej
package objectserver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class KopiowanieKatalogu
{
public static void main(String[] args)
{
File srcFolder = new File("c:\\folder");
File destFolder = new File("c:\\folder-nowy");
//upewnij się że źródło istnieje
if(!srcFolder.exists()){
System.out.println("Katalog nie istnieje.");
//po prostu wyjdź
System.exit(0);
}else{
try{
copyFolder(srcFolder,destFolder);
}catch(IOException e){
e.printStackTrace();
//błąd, po prostu wyjdź
System.exit(0);
}
}
System.out.println("Gotowe");
}
public static void copyFolder(File src, File dest)
throws IOException{
if(src.isDirectory()){
//Jeśli katalog nie istnieje należy go utworzyć
if(!dest.exists()){
dest.mkdir();
System.out.println("Katalog kopiuję z "
+ src + " do " + dest);
}
//Lista całej zawartości katalogu
String files[] = src.list();
for (String file : files) {
//Skonstruować strukture src i plik docelowy
File srcFile = new File(src, file);
File destFile = new File(dest, file);
//rekurencyjnie kopiuję
copyFolder(srcFile,destFile);
}
}else{
//jeśli plik, następnie skopiuj go
//Uzyj strumień bajtów do obsługi wszystkich typów plików
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
//skopiować zawartość pliku w bajtach
while ((length = in.read(buffer)) > 0){
out.write(buffer, 0, length);
}
in.close();
out.close();
System.out.println("File copied from " + src + " to " + dest);
}
}
}
- Rejestracja:około 14 lat
- Ostatnio:około 8 lat
Kod prowadzącego wykonuje kopiowanie w ramach jednego komputera. Więc musisz nie tylko połączyć go swoim kodem (czyli wywołać coś z czegoś), ale też zmodyfikować część jego kodu (tą która w procesie kopiowania nazwać można zapisem, bo odczyt zostawić można bez zmian chyba) tak, by działała za pośrednictwem twojej klasy na zdalnym komputerze...
Po namyśle stwierdzam, że w zasadzie to kod prowadzącego można użyć i po stronie klienta i po stronie serwera, a wtedy powinieneś zmodyfikować go tak, by można go było użyć do odczytu pliku i zapisu go do strumienia wyjściowego z klienta i jednocześnie tak by można było go użyć do zapisu pliku odczytywanego ze strumienia wejściowego na serwerze.