Advertisement
JoshuaStrutt

Network

Jan 23rd, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.91 KB | None | 0 0
  1. import java.awt.EventQueue;
  2. import java.io.IOException;
  3. import java.net.*;
  4. import java.util.*;
  5.  
  6. public class Server {
  7.  
  8.   private ServerSocket serverSocket;
  9.  
  10.   private boolean connected;
  11.  
  12.   private int port;
  13.  
  14.   private ArrayList<Client> clients;
  15.  
  16.   private ServerReceiveClients serverReceiveClients;
  17.  
  18.   private ArrayList<ServerListener> serverListeners = new ArrayList<ServerListener>();
  19.  
  20.   public void addServerListener(ServerListener serverListener){
  21.     serverListeners.add(serverListener);
  22.   }
  23.  
  24.   public void addServerListener(ArrayList<ServerListener> serverListeners){
  25.     this.serverListeners.addAll(serverListeners);
  26.   }
  27.  
  28.   public ArrayList<Client> getClients() {
  29.     return clients;
  30.   }
  31.  
  32.   private void setServerReceiveClients(ServerReceiveClients receiveClients) {
  33.     this.serverReceiveClients = receiveClients;
  34.   }
  35.  
  36.   public ServerReceiveClients getServerReceiveClients() {
  37.     return serverReceiveClients;
  38.   }
  39.  
  40.   private void setClients(ArrayList<Client> clients) {
  41.     this.clients = clients;
  42.   }
  43.  
  44.   public ServerSocket getServerSocket() {
  45.     return serverSocket;
  46.   }
  47.  
  48.   private void setServerSocket(ServerSocket serverSocket) {
  49.     this.serverSocket = serverSocket;
  50.   }
  51.  
  52.   public int getPort() {
  53.     return port;
  54.   }
  55.  
  56.   private void setPort(int port) {
  57.     this.port = port;
  58.   }
  59.  
  60.   public boolean isConnected() {
  61.     return connected;
  62.   }
  63.  
  64.   private void setConnected(boolean connected) {
  65.     this.connected = connected;
  66.   }
  67.  
  68.   public Server(int port, ServerListener serverListener) throws IOException{
  69.     if (serverListener != null){
  70.       this.addServerListener(serverListener);
  71.     }
  72.     init(port);
  73.   }
  74.  
  75.   public Server(int port, ArrayList<ServerListener> serverListeners) throws IOException{  
  76.     if (serverListeners != null){
  77.       this.addServerListener(serverListeners);
  78.     }
  79.     init(port);
  80.   }
  81.  
  82.   public Server(int port) throws IOException{
  83.     init(port);
  84.   }
  85.  
  86.   private void init(int port) throws IOException{
  87.     setConnected(false);
  88.     setPort(port);
  89.     setClients(new ArrayList<Client>());
  90.     setServerSocket(new ServerSocket(getPort()));
  91.     serverConnected();
  92.     ServerReceiveClients serverReceiveClients = new ServerReceiveClients(this);
  93.     setServerReceiveClients(serverReceiveClients);
  94.     getServerReceiveClients().start();
  95.     Runtime.getRuntime().addShutdownHook(new ServerShutdownHook(this));
  96.   }
  97.  
  98.   public void stop() throws IOException {
  99.     stop(true);
  100.   }
  101.  
  102.   void stop(final boolean volitional) throws IOException {
  103.     if (!isConnected()){return;}
  104.     setConnected(false);
  105.     for (Client c : getClients()){
  106.       c.stop(true);
  107.     }
  108.     getClients().clear();
  109.     getServerSocket().close();
  110.     EventQueue.invokeLater(new Runnable() {
  111.       public void run() {
  112.         try {
  113.           for (final ServerListener s : serverListeners){
  114.             s.serverStopped(volitional);
  115.           }  
  116.         }
  117.         catch (Exception e) {
  118.           e.printStackTrace();
  119.         }
  120.       }
  121.     });
  122.    
  123.   }
  124.  
  125.   public void broadcast(String content) throws IOException, NotConnectedException{
  126.     broadcast(content.getBytes());
  127.   }
  128.  
  129.   public void broadcast(byte[] content) throws IOException, NotConnectedException{
  130.     for (Client c : getClients()){
  131.       c.write(content);
  132.     }
  133.   }
  134.  
  135.   void serverConnected(){
  136.     setConnected(true);
  137.     EventQueue.invokeLater(new Runnable() {
  138.       public void run() {
  139.         try {
  140.           for (final ServerListener s : serverListeners){
  141.             s.serverConnected();
  142.           }
  143.         } catch (Exception e) {
  144.           e.printStackTrace();
  145.         }
  146.       }
  147.     });
  148.   }
  149.  
  150.   void clientConnected(Client c){
  151.     getClients().add(c);
  152.     for (ServerListener s : serverListeners){
  153.       s.clientConnected(c);
  154.     }
  155.   }
  156.  
  157.     void clientStopped(Client c, boolean volitional){
  158.       if (isConnected()){
  159.         getClients().remove(c);
  160.         for (ServerListener s : serverListeners){
  161.           s.clientStopped(c, volitional);
  162.         }
  163.       }
  164.   }
  165.  
  166.     void clientNewMessage(Client c,byte[] content){
  167.       for (ServerListener s : serverListeners){
  168.       s.clientNewMessage(c, content);
  169.     }
  170.     }
  171.    
  172. }
  173.  
  174. class ServerReceiveClients extends Thread {
  175.  
  176.   private Server server;
  177.   public Server getServer() {
  178.     return server;
  179.   }
  180.   public void setServer(Server server) {
  181.     this.server = server;
  182.   }
  183.  
  184.   public ServerReceiveClients(Server server){
  185.     setServer(server);
  186.   }
  187.  
  188.   @Override
  189.   public void run() {
  190.     while (getServer().isConnected()){
  191.       try{
  192.         Socket newSocket = getServer().getServerSocket().accept();
  193.         final Client newClient = new Client();
  194.         newClient.addClientListener(new ClientListener(){
  195.           @Override
  196.           public void connected() {
  197.             getServer().clientConnected(newClient);
  198.           }
  199.           @Override
  200.           public void stopped(boolean volitional) {
  201.             getServer().clientStopped(newClient, volitional);
  202.           }
  203.           @Override
  204.           public void newMessage(byte[] content) {
  205.             getServer().clientNewMessage(newClient,content);
  206.           }
  207.         });
  208.         newClient.init(newSocket);
  209.       }
  210.       catch (Exception se){
  211.         if (!getServer().isConnected()){return;}
  212.         try {
  213.           getServer().stop(false);
  214.         } catch (IOException e) {e.printStackTrace();}
  215.       }
  216.     }
  217.   }
  218. }
  219.  
  220. class ServerShutdownHook extends Thread{
  221.   private Server server;
  222.   public Server getServer() {
  223.     return server;
  224.   }
  225.   public void setServer(Server server) {
  226.     this.server = server;
  227.   }
  228.  
  229.   public ServerShutdownHook(Server server){
  230.     setServer(server);
  231.   }
  232.   public void run() {
  233.     try {
  234.       getServer().stop(false);
  235.     } catch (Exception e) {}
  236.   }
  237. }
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244. public interface ServerListener{
  245.     void serverConnected();
  246.     void serverStopped(boolean volitional);
  247.    
  248.     void clientConnected(Client c);    
  249.     void clientStopped(Client c, boolean volitional);
  250.     void clientNewMessage(Client c, byte[] content);
  251. }
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261. import java.net.*;
  262. import java.util.*;
  263. import java.awt.EventQueue;
  264. import java.io.*;
  265.  
  266. public class Client {
  267.  
  268.     private Socket socket;
  269.     private OutputStream outputStream;
  270.     private InputStream inputStream;
  271.     private ClientReceiveMessages clientReceiveMessages;
  272.    
  273.     private ArrayList<ClientListener> clientListeners = new ArrayList<ClientListener>();
  274.    
  275.     private boolean connected;
  276.    
  277.     public void addClientListener(ClientListener clientListener){
  278.         clientListeners.add(clientListener);
  279.     }
  280.    
  281.     public void addClientListener(ArrayList<ClientListener> clientListener){
  282.         clientListeners.addAll(clientListener);
  283.     }
  284.    
  285.     public boolean isConnected() {
  286.         return connected;
  287.     }
  288.    
  289.     private void setConnected(boolean connected) {
  290.         this.connected = connected;
  291.     }
  292.    
  293.     public ClientReceiveMessages getClientReceiveMessages() {
  294.         return clientReceiveMessages;
  295.     }
  296.     private void setClientReceiveMessages(
  297.             ClientReceiveMessages clientReceiveMessages) {
  298.         this.clientReceiveMessages = clientReceiveMessages;
  299.     }
  300.    
  301.     public Socket getSocket() {
  302.         return socket;
  303.     }
  304.     private void setSocket(Socket socket) {
  305.         this.socket = socket;
  306.     }
  307.     private OutputStream getOutputStream() {
  308.         return outputStream;
  309.     }
  310.     private void setOutputStream(OutputStream outputStream) {
  311.         this.outputStream = outputStream;
  312.     }
  313.     InputStream getInputStream() {
  314.         return inputStream;
  315.     }
  316.     private void setInputStream(DataInputStream inputStream) {
  317.         this.inputStream = inputStream;
  318.     }
  319.  
  320.     void setInputStream(InputStream inputStream) {
  321.         this.inputStream = inputStream;
  322.     }
  323.    
  324.     public Client(){}
  325.    
  326.     public Client(Socket socket) throws  IOException{
  327.         init(socket);
  328.     }
  329.    
  330.     public Client(String ip, int port, ArrayList<ClientListener> clientListeners) throws UnknownHostException, IOException{
  331.         if (clientListeners != null){
  332.             addClientListener(clientListeners);
  333.         }
  334.         init(new Socket(ip,port));
  335.     }
  336.    
  337.     public Client(String ip, int port, ClientListener clientListener) throws UnknownHostException, IOException{
  338.         if (clientListener != null){
  339.             addClientListener(clientListener);
  340.         }
  341.         init(new Socket(ip,port));
  342.     }
  343.  
  344.     public Client(Socket socket, ClientListener clientListener) throws  IOException{
  345.         if (clientListener != null){
  346.             addClientListener(clientListener);
  347.         }
  348.         init(socket);
  349.     }
  350.    
  351.     void init(Socket socket) throws IOException{
  352.         if (this.isConnected()) {return;}
  353.         setConnected(false);
  354.         setSocket(socket);
  355.         setOutputStream(new DataOutputStream(getSocket().getOutputStream()));
  356.         setInputStream(new DataInputStream(getSocket().getInputStream()));
  357.         setClientReceiveMessages(clientReceiveMessages);
  358.         connected();
  359.         ClientReceiveMessages clientReceiveMessages = new ClientReceiveMessages(this);
  360.         clientReceiveMessages.start();
  361.         Runtime.getRuntime().addShutdownHook(new ClientShutdownHook(this));
  362.     }
  363.    
  364.     public void write(String data) throws IOException, NotConnectedException{
  365.         write(data.getBytes());
  366.     }
  367.    
  368.     public void write(byte[] data) throws IOException, NotConnectedException{
  369.         if (!isConnected()){
  370.             throw new NotConnectedException();
  371.         }  
  372.         try{
  373.             new DataOutputStream(getOutputStream()).writeInt(data.length);
  374.             getOutputStream().write(data,0, data.length);
  375.             getOutputStream().flush();
  376.         }
  377.         catch(Exception ex){
  378.             ex.printStackTrace();
  379.             stop(false);
  380.             throw ex;
  381.         }  
  382.     }
  383.    
  384.     public void stop() throws IOException{
  385.         stop(true);
  386.     }
  387.    
  388.     void stop(final boolean volitional) throws IOException{
  389.         try{
  390.             if (!isConnected()){return;}
  391.             setConnected(false);
  392.             EventQueue.invokeLater(new Runnable() {
  393.                 public void run() {
  394.                     try {
  395.                         for (final ClientListener c : clientListeners){
  396.                             c.stopped(volitional);
  397.                         }
  398.                     } catch (Exception e) {                    
  399.                         e.printStackTrace();
  400.                     }
  401.                 }
  402.             });
  403.             getInputStream().close();
  404.             getOutputStream().close();
  405.             getSocket().close();
  406.         }
  407.         catch(Exception ex){
  408.             ex.printStackTrace();
  409.             throw ex;
  410.         }
  411.     }
  412.    
  413.     void connected(){
  414.         setConnected(true);
  415.         EventQueue.invokeLater(new Runnable() {
  416.             public void run() {
  417.                 try {
  418.                     for (final ClientListener c : clientListeners){
  419.                         c.connected();
  420.                     }
  421.                 } catch (Exception e) {
  422.                     e.printStackTrace();
  423.                 }
  424.             }
  425.         });
  426.     }
  427.    
  428.     void newMessage(final byte[] content){
  429.         EventQueue.invokeLater(new Runnable() {
  430.             public void run() {
  431.                 try {
  432.                     for (final ClientListener c : clientListeners){
  433.                         c.newMessage(content);
  434.                     }
  435.                 } catch (Exception e) {
  436.                     e.printStackTrace();
  437.                 }
  438.             }
  439.         });
  440.     }
  441.    
  442. }
  443.  
  444. class ClientReceiveMessages extends Thread{
  445.    
  446.     private Client client;
  447.     private Client getClient() {
  448.         return client;
  449.     }
  450.     private void setClient(Client client) {
  451.         this.client = client;
  452.     }
  453.     public ClientReceiveMessages(Client client){
  454.         setClient(client);
  455.     }
  456.    
  457.     public void run(){
  458.         while(getClient().isConnected()){
  459.             try{
  460.                 DataInputStream input = new DataInputStream(getClient().getInputStream());
  461.                 int msgSize = input.readInt();
  462.                 byte[] buffer = new byte[msgSize];
  463.                 input.readFully(buffer);
  464.                 getClient().newMessage(buffer);
  465.             }
  466.             catch(Exception ex){
  467.                 if (getClient().isConnected()){
  468.                     try {
  469.                         getClient().stop(false);
  470.                     } catch (IOException e) {}
  471.                 }
  472.             }
  473.         }
  474.     }
  475.    
  476. }
  477.  
  478. class ClientShutdownHook extends Thread {
  479.    
  480.     private Client client;
  481.     private Client getClient() {
  482.         return client;
  483.     }
  484.     private void setClient(Client client) {
  485.         this.client = client;
  486.     }
  487.     public ClientShutdownHook(Client client){
  488.         setClient(client);
  489.     }
  490.    
  491.     public void run() {
  492.         try {
  493.             getClient().stop(false);
  494.         } catch (Exception e) {}
  495.     }
  496.    
  497. }
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506. public interface ClientListener{
  507.     void connected();
  508.     void stopped(boolean volitional);
  509.     void newMessage(byte[] content);
  510. }
  511.  
  512.  
  513.  
  514.  
  515. public class NotConnectedException extends Exception{
  516.     private static final long serialVersionUID = 7712308961274293935L;
  517. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement