Sunday 15 September 2013

Java ObjectInputStream(Socket socket) restarts the whole application? -



Java ObjectInputStream(Socket socket) restarts the whole application? -

so i'm making java server , client.

currently client connects server , creates object input , output streams both client , server side.

immediately when seek receive info on objectinputstream(socket socket) of server restarts whole program.

it doesen't mention errors or exceptions or others? client says: "server has closed connection: java.net.socketexception: socket closed" <- server closes socket , related it.

here's server , client (+ bonus question: if there different named objects in server , client way objects made same, can send , read on socket?)

package com.server; import java.io.ioexception; import java.io.objectinputstream; import java.io.objectoutputstream; import java.net.socket; import java.net.serversocket; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import com.gui.screen; import com.gui.textarea; public class server implements runnable{ //every connection got own unique id private static int uniqueid; //list clients private static arraylist<clientthread> al; private static boolean running = false; @suppresswarnings("unused") private simpledateformat sdf; serversocket serversocket; public server(int port) { sdf = new simpledateformat("hh:mm:ss"); al = new arraylist<clientthread>(); } public void run() { running = true; seek { serversocket = new serversocket(screen.portnumber); } grab (ioexception e) { // todo auto-generated grab block e.printstacktrace(); } seek { //server socket textarea.addline("server running , waiting clients connect."); while(running){ socket socket = serversocket.accept(); clientthread t = new clientthread(socket); al.add(t); //saving new client our arraylist. t.run(); if(!running){ //this create server running stop. textarea.addline("closing server.."); break; } } for(int = 0; i< al.size(); i++){//we forget clients. //maybe save info here? clientthread tc = al.get(i); try{ tc.sinput.close(); tc.soutput.close(); tc.socket.close(); } catch(ioexception ioe){ } } serversocket.close(); } grab (ioexception e) { // todo auto-generated grab block e.printstacktrace(); } } public static void close() { running = false; seek { new socket("localhost", screen.portnumber); } grab (exception e) { textarea.addline("can't disconnect.."); } } synchronized void remove(int id) { // scan array list until find id for(int = 0; < al.size(); ++i) { clientthread ct = al.get(i); // found if(ct.id == id) { al.remove(i); return; } } } public static boolean isrunning(){ homecoming running; } class clientthread extends thread { //the socket listen/talk socket socket; objectinputstream sinput; objectoutputstream soutput; //my unique id (easier deconnection) int id; //objects receiving incomingdata datain; //the date connect string date; player player; //constructor clientthread(socket socket){ id = uniqueid++; this.socket = socket; try{ soutput = new objectoutputstream(socket.getoutputstream()); sinput = new objectinputstream(socket.getinputstream()); } grab (exception e){ system.out.println("couldn't create input/output streams"); } date = new date().tostring(); } // run forever public void run() { // loop until logout boolean connected = true; while(connected) { // read incoming info seek { //everything works until datain = (incomingdata) sinput.readobject(); //at point programme restarts? } grab (ioexception e) { textarea.addline(incomingdata.getusername(datain) + " exception reading streams: " + e); break; } catch(classnotfoundexception e2) { break; } if(datain != null){ // switch on type of message receive switch(incomingdata.getaction(datain).gettype()) { case 0://log off textarea.addline(player.getusername(player) + " logged off."); connected = false; break; case 1://talk textarea.addline(incomingdata.getusername(datain) + ": " +incomingdata.getaction(datain).getstring()); break; case 2://move player.move(player); } } } // remove myself arraylist containing list of // connected clients remove(id); close(); } // seek close private void close() { // seek close connection seek { if(soutput != null) soutput.close(); } catch(exception e) {} seek { if(sinput != null) sinput.close(); } catch(exception e) {}; seek { if(socket != null) socket.close(); } grab (exception e) {} } } }

and client:

package com.connection; import java.io.ioexception; import java.io.objectinputstream; import java.io.objectoutputstream; import java.net.socket; public class client { // i/o private objectinputstream sinput; // read socket private static objectoutputstream soutput; // write on socket private socket socket; private outgoingdata lastdata; private outgoingdata currentdata; static client client; public static boolean connected = false; public static player player; string server; int port; client(string server, int port) { this.server = server; this.port = port; } /* * when goes wrong * close input/output streams , disconnect not much in grab clause */ private void disconnect() { seek { if(sinput != null) sinput.close(); } catch(exception e) {} // not much else can seek { if(soutput != null) soutput.close(); } catch(exception e) {} // not much else can try{ if(socket != null) socket.close(); } catch(exception e) {} // not much else can } public boolean start() { // seek connect server seek { socket = new socket(server, port); } // if failed not much can catch(exception ec) { system.out.println("error connectiong server:" + ec); homecoming false; } system.out.println("connection accepted " + socket.getinetaddress() + ":" + socket.getport()); /* creating both info stream */ seek { sinput = new objectinputstream(socket.getinputstream()); soutput = new objectoutputstream(socket.getoutputstream()); } grab (ioexception eio) { system.out.println("exception creating new input/output streams: " + eio); homecoming false; } // creates thread hear server new listenfromserver().start(); // send our username server message // send string. other messages chatmessage objects seek { soutput.writeobject(new incomingdata("minisurma", "kaikim", null)); } grab (ioexception eio) { system.out.println("exception doing login : " + eio); disconnect(); homecoming false; } // success inform caller worked homecoming true; } public static void connect() { // default values int portnumber = 1500; string serveraddress = "localhost"; // create client object client = new client(serveraddress, portnumber); // test if can start connection server // if failed nil can if(!client.start()) return; connected = true; } public static void disconnect() { connected = false; client.disconnect(); } class listenfromserver extends thread { public void run() { while(true) { seek { outgoingdata info = (outgoingdata) sinput.readobject(); system.out.println("data"); } catch(ioexception e) { system.out.println("server has closed connection: " + e); } // can't happen string object need grab anyhow catch(classnotfoundexception e2) { } } } } public static void send(incomingdata incomingdata) { seek { soutput.writeobject(incomingdata); } catch(ioexception e) { system.out.println("exception writing server: " + e); } } }

client says: "server has closed connection: java.net.socketexception: socket closed"

that's your message, , isn't correct. you're assuming every ioexception means server closed connection. not so. 2 exceptions mean eofexception and, usually, ioexception: connection reset.

this particular exception socketexception: socket closed, , meaning you, client, closed connection , continued utilize it. example, if initial login fails, disconnect, listener thread still running, trying read.

don't mislead making false assumptions, , don't build them error messages.

nb:

you need create objectoutputstream before objectinputstream.

your listener thread needs grab eofexception , break out of loop when caught.

java sockets connection objectinputstream

No comments:

Post a Comment