Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.net.*;
- import java.util.*;
- public class Server
- {
- public static final int PORT = 50007;
- //set of unique clients names
- private static Set<String> names = new HashSet<>();
- //set of unique client senders
- private static Set<PrintWriter> senders = new HashSet<>();
- public static void main(String args[]) throws IOException
- {
- //create server socket
- ServerSocket server = new ServerSocket(PORT);
- Socket client;
- System.out.println("Waiting for connection to:" + server);
- while(true)
- {
- //waiting for client connection
- client = server.accept();
- //create new thread for handling new client
- new ClientHandler(client).start();
- }
- }
- private static class ClientHandler extends Thread
- {
- private String name; //client name
- private Socket client; //client socket
- private BufferedReader clientReceiver; //receiver
- private PrintWriter clientSender; //sender
- public ClientHandler(Socket client)
- {
- this.client = client;
- }
- public void run()
- {
- try
- {
- //create receiver stream
- this.clientReceiver = new BufferedReader(new InputStreamReader(this.client.getInputStream()));
- //create sender stream
- this.clientSender = new PrintWriter(this.client.getOutputStream());
- //ask new client for unique name
- this.clientSender.println("Your name?");
- this.clientSender.flush();
- while(true)
- {
- //if client buffer is not empty --> asign name
- if(this.clientReceiver.ready())
- {
- this.name = this.clientReceiver.readLine();
- synchronized(names)
- {
- //synchronus access to client's names
- //if unique name is not empty and not equals blank chars --> accept name
- if(!this.name.trim().isEmpty() && !names.contains(name))
- {
- //add name to known names
- names.add(this.name);
- //print welcome message
- this.clientSender.println("Welcome " + this.name + "!");
- this.clientSender.flush();
- break;
- }
- else
- {
- //if name in use or is empty --> ask for nem name
- this.clientSender.println("Name: " + this.name + "is already in use!\n" + "Your name?");
- this.clientSender.flush();
- }
- }
- }
- }
- //send message to all known clients, that new client has joined chat
- for (PrintWriter sender : senders)
- {
- sender.println(this.name + "has joined");
- sender.flush();
- }
- //add client to list of known clients
- senders.add(this.clientSender);
- //begin broadcasting
- String message = "";
- boolean exit = false;
- while(!exit)
- {
- //if client buffer is not empty --> broadcast message
- if(this.clientReceiver.ready())
- {
- message = this.clientReceiver.readLine();
- //format message
- if(!message.equalsIgnoreCase("end"))
- {
- message = "<" + this.name + ">:" + message;
- }
- else
- {
- //if message equals "end" --> close connection
- message = this.name + "has left";
- exit = true;
- }
- //send message to know hosts
- for(PrintWriter sender : senders)
- {
- if(sender != this.clientSender)
- {
- sender.println(message);
- sender.flush();
- }
- }
- }
- }
- //remove client from known hosts
- senders.remove(this.clientSender);
- names.remove(this.name);
- //close streams
- this.clientReceiver.close();
- this.clientSender.close();
- this.client.close();
- }
- catch(IOException e)
- {
- System.out.println(e);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement