multithreading - Java: How to implement a portlistener that doesn't block the rest of the program -
i have main
class in define java fx scene , stage, , maincontroller
in create database connection , start portlistener
. 3 different parts (views
, db connection
, port listener`) function when tested separately, when uncomment parts can test program in full working, doesn't work.
public class main extends application { maincontroller maincontroller; @override public void start(stage primarystage) { borderpane root = new borderpane(); scene scene = new scene(root, 1100, 690); root.settop(setupmenubar()); root.setcenter(setupcenter()); root.setbottom(setupstatusbar()); scene.getstylesheets().add(getclass().getresource("application.css").toexternalform()); primarystage.setscene(scene); maincontroller = new maincontroller(); maincontroller.initcontroller(primarystage); primarystage.show(); }
the problem never primarystage.show();
of main program because portlistener
sits , waits incoming messages seems me there's 1 thread running. (i thought java multi-threaded default)
the portlistener
should wait incoming messages, shouldn't block main
program functioning. i've changed portlistener
implement runnable
, read somewhere runnable's run()
method should called newly created thread's start()
method in class.
now there's problem, i've created startlistening
function in portlistener
has 2 parameters, portnumber
listen to, , maincontroller
instance, portlistener
can call function in maincontroller
once there incoming message. maincontroller
has database connection , variables port number, being class comes together.
the portlistener
:
public class portlistener implements runnable { boolean stayconnected = true; maincontroller maincontroller; serversocket serversocket; socket clientsocket = null; public void startlistening(int portnumber, maincontroller controller) throws ioexception { maincontroller = controller; try { serversocket = new serversocket(portnumber); serversocket.setreuseaddress(true); } catch (ioexception e) { system.err.println("could not start listener on port: " + portnumber); return; } while(stayconnected) { run(); } } public void run() { try { clientsocket = serversocket.accept(); system.out.println("connection established"); bufferedreader in = new bufferedreader(new inputstreamreader(clientsocket.getinputstream())); string inputline; while ((inputline = in.readline()) != null) { // todo: handle incoming message calling maincontroller system.out.println("line incoming: " + inputline); } in.close(); clientsocket.close(); serversocket.close(); } catch (ioexception e) { system.err.println("portlistener run() failed: " + e.getmessage()); } } public void stoplistening() { stayconnected = false; } }
i'm missing trivial, there many skilled programmers here, i'd rather ask i'm missing instead of trying hour (or two).
Comments
Post a Comment