Advertisement
Zoilorys

Chat Server

Mar 30th, 2015
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.83 KB | None | 0 0
  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4. import java.awt.event.*;
  5. import javax.swing.*;
  6. import java.awt.*;
  7. import java.text.SimpleDateFormat;
  8.  
  9. public class ChatServer {
  10.    
  11.     ArrayList<PrintWriter> clientOutputStreams;
  12.     ArrayList<String> users = new ArrayList<String>();
  13.     ArrayList<User> userData = new ArrayList<User>();
  14.     JFrame frame;
  15.     JTextArea log;
  16.     JButton quit;
  17.     SimpleDateFormat date = new SimpleDateFormat("'('HH:mm:ss')'");
  18.     JList userList;
  19.     Vector<String> userVectorList = new Vector<String>();
  20.    
  21.  
  22.     public static void main(String[] args) {
  23.        
  24.         new ChatServer().go();
  25.  
  26.     }
  27.    
  28.     //GUI stuff
  29.     public void init(){
  30.        
  31.         frame = new JFrame("Chat Server");
  32.         frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  33.        
  34.         log= new JTextArea(20,20);
  35.         log.setColumns(20);
  36.         log.setLineWrap(true);
  37.         log.setWrapStyleWord(true);
  38.         log.setEditable(false);
  39.         JScrollPane scroller = new JScrollPane(log);
  40.         scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  41.         scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  42.        
  43.         userList = new JList();
  44.         userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  45.         JScrollPane list = new JScrollPane(userList);
  46.         userList.setPrototypeCellValue("Index 1234567890");
  47.         frame.getContentPane().add(list, BorderLayout.EAST);
  48.         userList.setListData(userVectorList);
  49.        
  50.         quit = new JButton("Quit");
  51.         quit.addActionListener(new QuitButtonListener());
  52.        
  53.         frame.getContentPane().add(scroller, BorderLayout.WEST);
  54.         frame.getContentPane().add(BorderLayout.SOUTH, quit);
  55.        
  56.         frame.setBounds(400,200,370,300);
  57.         frame.pack();
  58.         frame.setVisible(true);
  59.         frame.requestFocus();
  60.        
  61.     }
  62.    
  63.     public void go(){
  64.        
  65.         clientOutputStreams = new ArrayList<PrintWriter>();
  66.            
  67.         init();
  68.            
  69.         try{
  70.            
  71.             ServerSocket server = new ServerSocket(5003);
  72.             ServerSocket userServer = new ServerSocket(5004);
  73.             User user;
  74.                
  75.             while(true){
  76.                    
  77.                 Socket client = server.accept();
  78.                 Socket clientUser = userServer.accept();
  79.                
  80.                 ObjectInputStream is = new ObjectInputStream(clientUser.getInputStream());
  81.                
  82.                 user = (User) is.readObject();
  83.                                        
  84.                     if(userData.contains(user)){
  85.                        
  86.                         log.append(date.format(new Date())+" User already in list");
  87.                        
  88.                     }else{
  89.                        
  90.                         userData.add(user);
  91.                         users.add(user.getName());
  92.                         log.append(date.format(new Date())+" User "+users.get(users.indexOf(user.getName()))+ " logged in \n");
  93.                         userVectorList.add(user.getName());
  94.                         userList.setListData(userVectorList);
  95.                         PrintWriter writer = new PrintWriter(client.getOutputStream());
  96.                         clientOutputStreams.add(writer);
  97.                        
  98.                     }
  99.                                    
  100.                 new Thread(new ClientHandler(client, user)).start();
  101.                 new Thread(new UserListHandler()).start();
  102.                 new Thread(new UserListUpdater()).start();
  103.                    
  104.             }
  105.         }catch(Exception e){e.printStackTrace();}
  106.     }
  107.    
  108.     public class QuitButtonListener implements ActionListener{
  109.        
  110.         public void actionPerformed(ActionEvent event){
  111.            
  112.             try{
  113.                
  114.                 PrintWriter logSave = new PrintWriter(new FileOutputStream("\\log"));          
  115.                 logSave.write(log.getText());
  116.                 logSave.close();
  117.                
  118.             }catch(Exception e){e.printStackTrace();}
  119.            
  120.             System.exit(0);
  121.            
  122.         }
  123.     }
  124.    
  125.     //user list server thread
  126.     public class UserListUpdater implements Runnable{
  127.        
  128.         public void run(){
  129.            
  130.             try{
  131.                
  132.                 ServerSocket userListUpdate = new ServerSocket(5005);
  133.                
  134.                 while(true){
  135.                    
  136.                     Socket sock = userListUpdate.accept();
  137.                    
  138.                     ObjectOutputStream os = new ObjectOutputStream(sock.getOutputStream());
  139.                     os.writeObject(userVectorList);
  140.                    
  141.                     sock.close();
  142.                    
  143.                 }
  144.                
  145.             }catch(Exception e){e.printStackTrace();}
  146.         }  
  147.     }
  148.     //user list update thread END
  149.    
  150.     // user online list handling thread runnable
  151.     public class UserListHandler implements Runnable{
  152.        
  153.         User onUser = null;
  154.        
  155.         public void run(){
  156.            
  157.             while(true){
  158.            
  159.                
  160.            
  161.                 for(int i = 0; i<userData.size(); i++){
  162.                
  163.                     if(!userData.get(i).isOnline()){
  164.                    
  165.                         users.remove(i);
  166.                         clientOutputStreams.remove(i);
  167.                         userVectorList.remove(i);
  168.                         userData.remove(i);
  169.                    
  170.                     }
  171.                    
  172.                 }
  173.                
  174.                 userList.setListData(userVectorList);
  175.                
  176.                 try{
  177.                    
  178.                     Thread.sleep(2000);
  179.                    
  180.                 }catch(Exception e){ e.printStackTrace();}
  181.                
  182.             }
  183.         }
  184.        
  185.     }///end user list runnable
  186.    
  187.     //RUNNABLE message handling thread
  188.     public class ClientHandler implements Runnable{
  189.        
  190.         BufferedReader reader;
  191.         Socket sock;
  192.         User user;
  193.        
  194.         public ClientHandler(Socket clientSocket, User userCurrent){
  195.            
  196.             try{
  197.                
  198.                 user = userCurrent;
  199.                 sock= clientSocket;
  200.                 InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
  201.                 reader = new BufferedReader(isReader);
  202.                
  203.             }catch(Exception e){
  204.                 e.printStackTrace();
  205.             }
  206.         }
  207.        
  208.         public void run(){
  209.            
  210.             String message;
  211.             String[] splitted;
  212.            
  213.             try{
  214.                
  215.                 while((message = reader.readLine())!=null){
  216.                    
  217.                     log.append("read "+ message+"\n");
  218.                    
  219.                     splitted = message.split(":");
  220.                    
  221.                     if(splitted[1].equals("broadcast")){
  222.                        
  223.                         tellEveryone(splitted[0],splitted[2]);
  224.                        
  225.                     }else{
  226.                        
  227.                         tellRecipient(splitted[1],splitted[2],splitted[0]);
  228.                        
  229.                     }
  230.                                        
  231.                 }
  232.                
  233.             }catch(Exception e){
  234.                
  235.                 log.append(date.format(new Date())+"User "+user.getName()+" disconnected \n");
  236.                 user.setOnlineStatus(false);
  237.                 e.printStackTrace();
  238.             }
  239.         }
  240.     }
  241.     // end RUNNABLE message handler
  242.    
  243.  
  244.     //broadcast method 
  245.     public void tellEveryone(String sender,String message){
  246.            
  247.         Iterator<PrintWriter> it = clientOutputStreams.iterator();
  248.            
  249.         while(it.hasNext()){
  250.             try{
  251.                    
  252.                 PrintWriter writer = (PrintWriter) it.next();
  253.                 writer.println(sender+":"+"broadcast"+":"+message);
  254.                 writer.flush();
  255.                    
  256.             }catch(Exception e){
  257.                 e.printStackTrace();
  258.             }
  259.         }
  260.     }
  261.     //private message
  262.     public void tellRecipient(String recipient, String message, String sender){
  263.        
  264.         int senderIndex = users.indexOf(sender);
  265.         int recipientIndex = users.indexOf(recipient);
  266.        
  267.         if(users.contains(recipient)){
  268.        
  269.             try{
  270.            
  271.                 PrintWriter writer = clientOutputStreams.get(recipientIndex);
  272.                 writer.println(sender+":"+recipient+":"+message);
  273.                 writer.flush();
  274.                
  275.                 PrintWriter writerBack = clientOutputStreams.get(senderIndex);
  276.                 writerBack.println(sender+":"+recipient+":"+message);
  277.                 writerBack.flush();
  278.                    
  279.             }catch(Exception e){ e.printStackTrace();}
  280.        
  281.         }else{
  282.            
  283.             try{
  284.                
  285.                 PrintWriter writer = clientOutputStreams.get(senderIndex);
  286.                 writer.println("Server Message: :Failed to send message: user is not online.");
  287.                 writer.flush();
  288.                    
  289.             }catch(Exception e){ e.printStackTrace();}
  290.            
  291.         }
  292.     }
  293.        
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement