Witam, piszę od nowa aplikacje pobierajaca dane z serwera i zwracajaca dane do klienta. Jednak mam pewien problem, serwer poprawnie wyrzuca wszystkie dane, jednak przy kolejnym pobraniu danych na kliencie wyskakuje błąd java.io.EOFException, natomiast na serwerze wyskakuje ponizzszy log:
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at pl.allst.rpi.serwer.core.ResponseThread.run(ResponseThread.java:21)
Poniżej podaje metode run(), która wyrzuca wyjątek:
public void run() {
try(BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); )
{
String inputLine ;
//TODO PROCESS INPUT
while ((inputLine = in.readLine()) != null) {
if(inputLine.equals("STATUS")){
ObjectOutputStream outO = new ObjectOutputStream(socket.getOutputStream());
status.update();
outO.writeObject(status);
outO.flush();
outO.close();
}
else if(inputLine.equals("NAME")){
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(StaticActions.getName());
}
else if(inputLine.equals("RAMTOTAL")){
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(StaticActions.getRamTotal());
}
else if(inputLine.equals("RESET")){
StaticActions.rebootPi();
}
else if(inputLine.equals("TEST")){
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("OK");
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Wydaje mi się że błąd u klienta jest spowodowany tym że serwer zamyka socketa przy ponownym wyslaniu danych, tak jak powiedzialem za pierwszym razem wszystko idzie bez problemu. Jeszcze podam fragment kodu klienta odpowiedzialnego za przetworzenie obiektu przeslanego przez serwer.
public void run(){
try(Socket skt = new Socket(host,port);
PrintStream Output = new PrintStream(skt.getOutputStream());)
{
BufferedReader Input = new BufferedReader(new InputStreamReader(skt.getInputStream()));
Output.println("NAME");
String buf=Input.readLine();
System.out.println(buf);
app.getSystemNameLbl().setText(buf);
app.setNameLbl(buf);
Output.println("RAMTOTAL");
buf=Input.readLine();
System.out.println(buf);
ramTotal=Integer.parseInt(buf);
app.getRamTotalLbl().setText(buf+" MB");
app.getRamBar().setMaximum(ramTotal);
Status status;
Output.println("STATUS");
ObjectInputStream ois = new ObjectInputStream(skt.getInputStream());
status = (Status) ois.readObject();
while(status!=null){
app.getRamBar().setValue((int)((ramTotal-status.getRamAvailable())*100)/1024);
app.getTempBar().setValue((int)Math.round(status.getTemp()));
app.getTempBar().setString(String.valueOf(status.getTemp())+"'C");
StringBuilder sb = new StringBuilder();
for(String x : status.getPplLogged()){
sb.append(x);
sb.append("\n");
}
app.getLoggedUsersArea().setText(sb.toString());
Thread.sleep(5000);
Output.println("STATUS");
status = (Status) ois.readObject();
}
ois.close();
}
Proszę o pomoc
Pozdrawiam.