// Binary Tree Communicator: this program has the ability to // read write Bst2020 (or subclass) structure to file or TCP/IP socket. // requires Tree.java Bst2020.java, BstGraph.java import java.io.*; import java.net.*; public class BstComm & Serializable> { public static final int BSTPORT = 17001; // TCP port of listener public static final String DefaultServer = "96.57.41.74"; // write object to file public void filewrite(String filename,Bst2020 tree) { if (tree==null) return; try { FileOutputStream fout = new FileOutputStream(filename); ObjectOutputStream bout = new ObjectOutputStream(fout); bout.writeObject(tree); bout.close(); fout.close(); } catch(IOException ee) {System.out.println(ee);} }//write to file @SuppressWarnings("unchecked") public Bst2020 fileread(String filename) // read object from file { Bst2020 answer=null; try { FileInputStream fin = new FileInputStream(filename); ObjectInputStream btin = new ObjectInputStream(fin); answer = (Bst2020)btin.readObject(); btin.close(); fin.close(); } catch(Exception ee) {System.out.println(ee);} return answer; // returns null on error }//read from file // send to tcp server listening at ipaddr:BSTPORT public void send(String ipaddr, Bst2020 tree) { if (tree==null) return; try { Socket sout = new Socket(ipaddr,BSTPORT); sout.setSoTimeout(3000); ObjectOutputStream bout = new ObjectOutputStream(sout.getOutputStream()); bout.writeObject(tree); bout.close(); sout.close(); } catch(IOException ie) { System.out.println(ie); } }//send to server public void send(Bst2020 tree) { send(DefaultServer,tree); } @SuppressWarnings("unchecked") public Bst2020 receive() // function "blocks" until tree received { Bst2020 answer=null; try { ServerSocket server = new ServerSocket(BSTPORT); server.setReuseAddress(true); // disable Timewait state Socket csock = server.accept(); // wait for client connection System.out.println("BstComm connection from "+csock.getInetAddress()+":"+csock.getPort()); ObjectInputStream bin = new ObjectInputStream(csock.getInputStream()); answer = (Bst2020)bin.readObject(); bin.close(); csock.close(); server.close(); } catch(Exception ee) {System.out.println(ee);} return answer; // returns null on error }// receive from network // looping server that accepts and display trees protected boolean runserver; // controls blocking server loop public void stopserver() {runserver=false;} @SuppressWarnings("unchecked") public void displayServer() { Bst2020 answer; BstGraph G = new BstGraph(1024,720); try { ServerSocket server = new ServerSocket(BSTPORT); server.setReuseAddress(true); // disable Timewait state runserver = true; while (runserver) { Socket csock = server.accept(); // wait for client connection System.out.println("BST display server connection from "+csock.getInetAddress()+":"+csock.getPort()); ObjectInputStream bin = new ObjectInputStream(csock.getInputStream()); answer = (Bst2020)bin.readObject(); bin.close(); csock.close(); G.draw(answer); } // server loop server.close(); } catch(Exception ee) {System.out.println(ee);} }// display server //main calls displayserver on Integer tree public static void main(String[] av) { BstComm treecomm = new BstComm(); if (av.length==0) // be server { treecomm.displayServer(); } else // be client: send to server on localhost (sample code) { Bst2020 tree = new Bst2020(); //Bst2020 tree = new AVLSet(); for(int i=0;i<20;i++) {tree.add(i);} treecomm.send(tree); // send to default server //treecomm.send("127.0.0.1",tree); // send to localhost } }//main }//BstComm