package cs522.elind.socket; import java.io.*; import java.net.*; import cs522.elind.base.*; import cs522.elind.io.*; public class SocketChat implements Chat { protected boolean statsDisplayed = false; protected boolean keepRunning = true; protected BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); public static final int TIME_OUT = 500; private boolean isHost; private String host = "localhost"; private int port = 4444; MonitorInputStream mInStream; MonitorOutputStream mOutStream; ObjectInputStream inStream; ObjectOutputStream outStream; MonitorServerSocket mss; MonitorSocket ms; PrintWriter fw = null; long br = 0; long bw = 0; public static void main(String[] args) { SocketChat sc; if(args.length != 3) { System.out.println("usage: java SocketChat "); System.exit(1); } if(args[0].equals("true")) { sc = new SocketChat(true, args[1], Integer.parseInt(args[2])); } else { sc = new SocketChat(false, args[1], Integer.parseInt(args[2])); } } public SocketChat(boolean inIsHost, String inBuddyHost, int inPort) { isHost = inIsHost; host = host; port = inPort; if(isHost) { setupHost(); } else { setupClient(); } new Thread(new StreamReader()).start(); new Thread(new KeyboardReader()).start(); } private void setupClient() { try { File outputFile = new File("SocketChatClient.txt"); fw = new PrintWriter(new FileWriter(outputFile)); ms = new MonitorSocket(host, port); mOutStream = (MonitorOutputStream)ms.getOutputStream(); bw = mOutStream.bytesWritten(); outStream = new ObjectOutputStream(mOutStream); mInStream = (MonitorInputStream)ms.getInputStream(); br = mInStream.bytesRead(); inStream = new ObjectInputStream(mInStream); fw.println("setupClient() bytesRead = "+(mInStream.bytesRead() - br)); fw.println("setupClient() bytesWritten = "+(mOutStream.bytesWritten() - bw)); } catch(IOException e) { e.printStackTrace(); System.exit(1); } } private void setupHost() { try { File outputFile = new File("SocketChatServer.txt"); fw = new PrintWriter(new FileWriter(outputFile)); mss = new MonitorServerSocket(port); ms = (MonitorSocket)mss.accept(); mOutStream = (MonitorOutputStream)ms.getOutputStream(); bw = mOutStream.bytesWritten(); outStream = new ObjectOutputStream(mOutStream); mInStream = (MonitorInputStream)ms.getInputStream(); br = mInStream.bytesRead(); inStream = new ObjectInputStream(mInStream); fw.println("setupHost() bytesRead = "+(mInStream.bytesRead() - br)); fw.println("setupHost() bytesWritten = "+(mOutStream.bytesWritten() - bw)); } catch (IOException e) { e.printStackTrace(); System.exit(1); } } public void send(Message msg) { try { if(!ms.isClosed()) { bw = mOutStream.bytesWritten(); br = mInStream.bytesRead(); outStream.writeObject(msg); fw.println("send("+msg+") bytesRead = "+(mInStream.bytesRead() - br)); fw.println("send("+msg+") bytesWritten = "+(mOutStream.bytesWritten() - bw)); } else { keepRunning = false; } } catch(IOException e) { e.printStackTrace(); } } public void receive(Message msg) { System.out.println(msg.getTimeStamp()+" - "+msg.getText()); } protected synchronized void displayStats() { if(!statsDisplayed) { fw.println("Bytes received = "+mInStream.bytesRead()); fw.println("Bytes written = "+mOutStream.bytesWritten()); statsDisplayed = false; } } class StreamReader implements Runnable { public void run() { Object obj = null; try { while(keepRunning) { if(!ms.isClosed()) { br = mInStream.bytesRead(); bw = mOutStream.bytesWritten(); obj = inStream.readObject(); fw.println("run("+obj+") bytesRead = "+(mInStream.bytesRead() - br)); fw.println("run("+obj+") bytesWritten = "+(mOutStream.bytesWritten() - bw)); if(obj == null) { break; } receive((Message)obj); } else { keepRunning = false; } } } catch(Exception e) { keepRunning = false; } displayStats(); fw.close(); System.exit(0); } } public class KeyboardReader implements Runnable { public void run() { String line = ""; try { while(keepRunning) { line = stdIn.readLine(); if(line == null) { break; } send(new Message(line)); } } catch(Exception e) { keepRunning = false; } displayStats(); fw.close(); System.exit(0); } } }