package org.ninjadev.multivim.server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import org.ninjadev.multivim.Buffer; import org.ninjadev.multivim.Cursor; import org.ninjadev.multivim.CursorData; import org.ninjadev.multivim.IServer; import org.ninjadev.multivim.Message; import org.ninjadev.multivim.User; import org.ninjadev.multivim.UserData; import org.ninjadev.multivim.ViewPort; import org.ninjadev.multivim.server.net.MessageHandler; import org.ninjadev.multivim.server.net.SendMessage; public class Server implements IServer { public HashMap<Integer, User> users; public LinkedList<Buffer> buffers; public Server() throws IOException{ users = new HashMap<Integer,User>(); buffers = new LinkedList<Buffer>(); Buffer buffer = createBuffer(); buffer.readFile("README.txt"); buffers.add(buffer); } public Buffer createBuffer() throws IOException{ Buffer buffer = new Buffer(); for(User u : users.values()){ u.cursors.put(buffer.bufferId, new Cursor(buffer, u)); } SendMessage.newBuffer(users, buffer); return buffer; } public void addConnection(Socket socket) throws IOException{ System.out.println("Connected: "+socket); User user = new User(); for(Buffer b : buffers){ user.cursors.put(b.bufferId, new Cursor(b, user)); } user.socket = socket; users.put(user.getUserId(), user); new ServerThread(socket, this, user).start(); } public void removeUser(User user) throws IOException{ users.remove(user.getUserId()); SendMessage.removeUser(users, user); System.out.println("Disonnected: "+user); } public class ServerThread extends Thread { private Socket socket; private Server server; private User user; ObjectOutputStream os; ObjectInputStream is; public ServerThread(Socket socket, Server server, User user) throws IOException{ super("ServerThread"); this.socket = socket; this.server = server; this.user = user; os = new ObjectOutputStream(socket.getOutputStream()); is = new ObjectInputStream(socket.getInputStream()); user.is = is; user.os = os; } public void run(){ MessageHandler messageHandler = new MessageHandler(server); try { SendMessage.identity(user, user.data); SendMessage.allUsers(user, users); SendMessage.allBuffers(user, buffers); user.activeViewPort.setBuffer(buffers.getFirst()); SendMessage.addUser(users, user); SendMessage.setCursor(user, users); SendMessage.render(user); } catch (IOException e) { e.printStackTrace(); } Message inputMessage = null; try { while ((inputMessage = (Message)is.readObject()) != null) { System.out.println("Message received: "+inputMessage.command); messageHandler.processMessage(user, inputMessage); } } catch (Exception e) { e.printStackTrace(); } try { server.removeUser(user); os.close(); is.close(); socket.close(); } catch (IOException e) {e.printStackTrace(); } } } public static void main(String[]args) throws IOException{ Server server = new Server(); ServerSocket serverSocket = new ServerSocket(9999); while(true){ Socket sock = serverSocket.accept(); server.addConnection(sock); } } }