Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.net.*;
- import java.util.*;
- import java.awt.event.*;
- import javax.swing.*;
- import java.awt.*;
- import java.text.SimpleDateFormat;
- public class ChatServer {
- ArrayList<PrintWriter> clientOutputStreams;
- ArrayList<String> users = new ArrayList<String>();
- ArrayList<User> userData = new ArrayList<User>();
- JFrame frame;
- JTextArea log;
- JButton quit;
- SimpleDateFormat date = new SimpleDateFormat("'('HH:mm:ss')'");
- JList userList;
- Vector<String> userVectorList = new Vector<String>();
- public static void main(String[] args) {
- new ChatServer().go();
- }
- //GUI stuff
- public void init(){
- frame = new JFrame("Chat Server");
- frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
- log= new JTextArea(20,20);
- log.setColumns(20);
- log.setLineWrap(true);
- log.setWrapStyleWord(true);
- log.setEditable(false);
- JScrollPane scroller = new JScrollPane(log);
- scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
- scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
- userList = new JList();
- userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- JScrollPane list = new JScrollPane(userList);
- userList.setPrototypeCellValue("Index 1234567890");
- frame.getContentPane().add(list, BorderLayout.EAST);
- userList.setListData(userVectorList);
- quit = new JButton("Quit");
- quit.addActionListener(new QuitButtonListener());
- frame.getContentPane().add(scroller, BorderLayout.WEST);
- frame.getContentPane().add(BorderLayout.SOUTH, quit);
- frame.setBounds(400,200,370,300);
- frame.pack();
- frame.setVisible(true);
- frame.requestFocus();
- }
- public void go(){
- clientOutputStreams = new ArrayList<PrintWriter>();
- init();
- try{
- ServerSocket server = new ServerSocket(5003);
- ServerSocket userServer = new ServerSocket(5004);
- User user;
- while(true){
- Socket client = server.accept();
- Socket clientUser = userServer.accept();
- ObjectInputStream is = new ObjectInputStream(clientUser.getInputStream());
- user = (User) is.readObject();
- if(userData.contains(user)){
- log.append(date.format(new Date())+" User already in list");
- }else{
- userData.add(user);
- users.add(user.getName());
- log.append(date.format(new Date())+" User "+users.get(users.indexOf(user.getName()))+ " logged in \n");
- userVectorList.add(user.getName());
- userList.setListData(userVectorList);
- PrintWriter writer = new PrintWriter(client.getOutputStream());
- clientOutputStreams.add(writer);
- }
- new Thread(new ClientHandler(client, user)).start();
- new Thread(new UserListHandler()).start();
- new Thread(new UserListUpdater()).start();
- }
- }catch(Exception e){e.printStackTrace();}
- }
- public class QuitButtonListener implements ActionListener{
- public void actionPerformed(ActionEvent event){
- try{
- PrintWriter logSave = new PrintWriter(new FileOutputStream("\\log"));
- logSave.write(log.getText());
- logSave.close();
- }catch(Exception e){e.printStackTrace();}
- System.exit(0);
- }
- }
- //user list server thread
- public class UserListUpdater implements Runnable{
- public void run(){
- try{
- ServerSocket userListUpdate = new ServerSocket(5005);
- while(true){
- Socket sock = userListUpdate.accept();
- ObjectOutputStream os = new ObjectOutputStream(sock.getOutputStream());
- os.writeObject(userVectorList);
- sock.close();
- }
- }catch(Exception e){e.printStackTrace();}
- }
- }
- //user list update thread END
- // user online list handling thread runnable
- public class UserListHandler implements Runnable{
- User onUser = null;
- public void run(){
- while(true){
- for(int i = 0; i<userData.size(); i++){
- if(!userData.get(i).isOnline()){
- users.remove(i);
- clientOutputStreams.remove(i);
- userVectorList.remove(i);
- userData.remove(i);
- }
- }
- userList.setListData(userVectorList);
- try{
- Thread.sleep(2000);
- }catch(Exception e){ e.printStackTrace();}
- }
- }
- }///end user list runnable
- //RUNNABLE message handling thread
- public class ClientHandler implements Runnable{
- BufferedReader reader;
- Socket sock;
- User user;
- public ClientHandler(Socket clientSocket, User userCurrent){
- try{
- user = userCurrent;
- sock= clientSocket;
- InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
- reader = new BufferedReader(isReader);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- public void run(){
- String message;
- String[] splitted;
- try{
- while((message = reader.readLine())!=null){
- log.append("read "+ message+"\n");
- splitted = message.split(":");
- if(splitted[1].equals("broadcast")){
- tellEveryone(splitted[0],splitted[2]);
- }else{
- tellRecipient(splitted[1],splitted[2],splitted[0]);
- }
- }
- }catch(Exception e){
- log.append(date.format(new Date())+"User "+user.getName()+" disconnected \n");
- user.setOnlineStatus(false);
- e.printStackTrace();
- }
- }
- }
- // end RUNNABLE message handler
- //broadcast method
- public void tellEveryone(String sender,String message){
- Iterator<PrintWriter> it = clientOutputStreams.iterator();
- while(it.hasNext()){
- try{
- PrintWriter writer = (PrintWriter) it.next();
- writer.println(sender+":"+"broadcast"+":"+message);
- writer.flush();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- //private message
- public void tellRecipient(String recipient, String message, String sender){
- int senderIndex = users.indexOf(sender);
- int recipientIndex = users.indexOf(recipient);
- if(users.contains(recipient)){
- try{
- PrintWriter writer = clientOutputStreams.get(recipientIndex);
- writer.println(sender+":"+recipient+":"+message);
- writer.flush();
- PrintWriter writerBack = clientOutputStreams.get(senderIndex);
- writerBack.println(sender+":"+recipient+":"+message);
- writerBack.flush();
- }catch(Exception e){ e.printStackTrace();}
- }else{
- try{
- PrintWriter writer = clientOutputStreams.get(senderIndex);
- writer.println("Server Message: :Failed to send message: user is not online.");
- writer.flush();
- }catch(Exception e){ e.printStackTrace();}
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement