package dk.socketmud.io; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.Iterator; import dk.socketmud.util.Colour; import dk.socketmud.object.Character; public class SMClient { public enum State { PromptName, PromptNameVerify, Connected }; protected SMServer server; protected Character ch; protected State state; protected Socket socket; protected StringBuffer outBuffer; protected String inBuffer; protected String nameBuffer; public SMClient(SMServer server, Socket socket) throws NullPointerException, SocketException { if (server == null) throw new NullPointerException("server cannot be NULL"); if (socket == null) throw new NullPointerException("socket cannot be NULL"); this.server = server; this.state = State.PromptName; this.socket = socket; this.outBuffer = new StringBuffer(); this.inBuffer = null; this.nameBuffer = null; this.ch = null; socket.setSoTimeout(10); } public void write(String s) { outBuffer.append(Colour.escape(s)); } public void read() throws IOException, SocketTimeoutException { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); inBuffer = br.readLine(); } public void flush() throws IOException { if (outBuffer.length() > 0) { OutputStream os = socket.getOutputStream(); if (state.equals(State.Connected)) { outBuffer.append("\r\n$> "); os.write("\r\n".getBytes()); } os.write(outBuffer.toString().getBytes()); outBuffer.setLength(0); } } public void close() throws IOException { socket.close(); server.clients.remove(this); } public ArrayList<Character> getAllCharacters() { ArrayList<Character> gch = new ArrayList<Character>(); Iterator<SMClient> clients = server.clients.iterator(); while (clients.hasNext()) { SMClient client = clients.next(); if (client.state == State.Connected && client.ch != null) gch.add(client.ch); } return gch; } }