Witam,
jestem początkujący więc proszę o wyrozumienie :)
Staram się napisać program klient/serwer dzięki,któremu użytkownik może porównać dwie daty,które wpisuje ( różnica w dniach ). Program działa i klient przesyła dane do serwera i porównuje je ale tylko wtedy gdy jedną z dat jest data czasu pobieranego w danej chwili poprzez
Date date2 = new Date();
, w przypadku gdy próbuje porównać dwie wpisane daty to pojawia się błąd Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.<init>(String.java:208)at TCP_klient.main(TCP_klient.java:57)Java Result: 1
w kliencie! (zmieniam przesłane dane od klienta na stringi potem na date i porównuje).Przesyłana jest tylko pierwsza data.
Dlaczego nie mogę w sytuacji przesłania dwóch dat stworzyć dwóch różnych zmiennych typu Date i ich porównać? Gdy pozbędę się drugiego wywołania Date obie zmienne są przesyłane...Z góry dzięki za pomoc
Klient:
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
public class TCP_klient
{
/*String bufor_wy;
public static void wyslij(bufor_wy)
{
wyjscie.write(bufor_wy,0,bufor_wy.length());
wyjscie.flush();
n = wejscie.read(dane,0,1000);
String bufor_we = new String(dane,0,n);
System.out.println("KLIENT> " + bufor_we);
}*/
public static void main(String[] args) throws IOException
{
InetAddress adresSerwera = InetAddress.getByName(args.length !=1 ? "localhost" : args[0]);
Socket gniazdo = new Socket(adresSerwera, TCP_serwer.PORT);
System.out.println("KLIENT> Polaczono z serwerem "+ gniazdo.getRemoteSocketAddress() + " z portu " + gniazdo.getLocalPort());
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
try{
BufferedReader klawiatura = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader wejscie = new InputStreamReader(gniazdo.getInputStream());
OutputStreamWriter wyjscie = new OutputStreamWriter(gniazdo.getOutputStream());
String bufor_wy;
char[] dane = new char[1000];
int n;
System.out.println("KLIENT> System oblicza liczbe dni pomiędzy dwoma podanymi przez uzytkownika datami..");
//pierwsza data
System.out.println("KLIENT> Podaj pierwsza date: ");
System.out.print("Podaj dzień: ");
int d1 = Integer.parseInt(klawiatura.readLine());
System.out.print("\nPodaj miesiac: ");
int m1 = Integer.parseInt(klawiatura.readLine());
System.out.print("\nPodaj rok: ");
int r1 = Integer.parseInt(klawiatura.readLine());
String data1 = r1 + "-" + m1 + "-" + d1;
System.out.println("\nPierwsza data to: " + data1);
if(data1.length() != 0)
{
wyjscie.write(data1,0,data1.length());
wyjscie.flush();
n = wejscie.read(dane,0,1000);
String bufor_we = new String(dane,0,n);
System.out.println("KLIENT> " + bufor_we);
}
//druga data
System.out.println("KLIENT> Podaj druga date: ");
System.out.print("Podaj dzień: ");
int d2 = Integer.parseInt(klawiatura.readLine());
System.out.print("\nPodaj miesiac: ");
int m2 = Integer.parseInt(klawiatura.readLine());
System.out.print("\nPodaj rok: ");
int r2 = Integer.parseInt(klawiatura.readLine());
String data2 = r2 + "-" + m2 + "-" + d2;
System.out.println("\nDruga data to: " + data2);
//bufor_wy = data2;
//while(bufor_wy.length() != 0)
if(data2.length() !=0)
{
wyjscie.write(data2,0,data2.length());
wyjscie.flush();
n = wejscie.read(dane,0,1000);
String bufor_we = new String(dane,0,n);
System.out.println("KLIENT> " + bufor_we);
}
//System.out.println("KLIENT> Koniec");
} finally {
gniazdo.close();
}
}
}
Serwer:
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
class ObslugaKlienta extends Thread
{
private Socket gniazdo;
private InputStreamReader wejscie;
private OutputStreamWriter wyjscie;
public ObslugaKlienta(Socket polaczenie) throws IOException
{
gniazdo = polaczenie;
wejscie = new InputStreamReader(gniazdo.getInputStream());
wyjscie = new OutputStreamWriter(gniazdo.getOutputStream());
start();
}
public void run()
{
int n;
long id = getId();
char[] dane = new char[1000];
String wiad1 = null;
String wiad2 = null;
System.out.println("SERWER[" + id + "]> Polaczenie z klientem " + gniazdo.getRemoteSocketAddress());
try
{
while(true)
{
n = wejscie.read(dane,0,1000);
if(n != 0)
{
String komunikat = new String(dane,0,n);
//wpis do tablicy
if( wiad1 == null){
wiad1 = komunikat;
System.out.println("\nwiad1: "+wiad1);
}
else {
wiad2 = komunikat;
System.out.println("\nwiad2: "+wiad2);
}
//koniec wpis do tablicy
//tokenizer
//koniec tokenizer
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//formatter.setLenient(false);
Date date1 = (Date)formatter.parse(wiad1);
//Date date2 = (Date)formatter.parse(wiad2);
//date2 = (Date)formatter.parse(wiad2);
//Calendar cal1 = Calendar.getInstance();
//cal1.setTime(date1);
//date1.clone();
Date date2 = (Date)formatter.parse(wiad2);
long datediff = ((date1.getTime()-date2.getTime())/(24*60*60*1000));
System.out.println("\nSERWER[" + id + "]> " + datediff+" dni");
wyjscie.write(dane,0,n);
wyjscie.flush();
}else throw new IOException();
}
}catch(Exception e){
}finally{
try{
System.out.println("SERWER[" + id + "]> Rozlaczenie klienta " + gniazdo.getRemoteSocketAddress());
gniazdo.close();
}catch(IOException e){}
}
}
}
public class TCP_serwer
{
public static final int PORT = 7000;
public static void main (String[] args)throws IOException
{
ServerSocket nasluch = new ServerSocket(PORT);
System.out.println("SERWER> Czekam na zgloszenia klientow..");
try{
while(true){
Socket polaczenie = nasluch.accept();
System.out.printf("SERWER> Zgloszenie klienta " + polaczenie.getRemoteSocketAddress());
try{
new ObslugaKlienta(polaczenie);
}catch(IOException e){
polaczenie.close();
}
}
}finally{} //opracowac zakonczenie
}
}
Wiem,że być może piszę nie jasno o co mi chodzi i w czym jest problem więc proszę o pytania!