0

How can I make this use multiple threads as clients - who all perform a task each within the switch statement? I would also like the threads to perform these tasks and once they have carried them out they stop (currently these tasks are performed from user input).

There are 3 classes the server, client and developer database - which holds a constructor for the 'developer' objects within an ArrayList in the server. This array list is providing the information which is being passed to the clients upon their specific requests.

Here is my code: Client:

 import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.*;

public class QuoteOfTheDayClient_2 {
static String devName;
static String devSkill;
static Boolean devHire;
static Socket echoSocket = null;  // holds the Socket object
static Scanner fromServer = null;   // input stream from remote host
static Scanner fromServer1 = null;   // input stream from remote host
static PrintWriter toServer = null; // output stream to remote host
static PrintWriter toServer1 = null; // output stream to remote host
static Scanner stdIn = new Scanner(System.in);
static String remoteServer = "localhost";          // are you 'local'?!
//String remoteServer = "193.61.190.96"; // remote host is not 'local'!
static int port;
static String reply;// holds reply from remote host


  public static void searchForSkill(String skill) {
    toServer.println(1);
    String quoteNum = "php"; //Search for a specific coding language - 
  Specific to the entered parameters
    System.out.println("Searching for Skill: " + skill + " in Developer 
   Database");
    toServer.println(quoteNum);
    while (!(reply = fromServer.nextLine()).isEmpty()) {
        // System.out.println(reply1);
        System.out.println(reply);// print reply to screen
    }
    fromServer.nextLine();     // Consume the newline
    System.out.println();

   }
   public static void addDeveloper(String name, String skill,boolean 
   hire) 
    {
    toServer.println(2);
    System.out.println("Add Developer to system ");
    stdIn.nextLine();   // flush newline
    String quoteString = name;//stdIn.nextLine();
    String quoteString1 = skill;//stdIn.nextLine();
    boolean quoteString2 = hire;//stdIn.nextLine();
    toServer.println(quoteString);
    toServer.println(quoteString1);
    toServer.println(quoteString2);
    fromServer.next();
    System.out.println("\nDeveloper entered: " + quoteString + "\n");
    while (!(reply = fromServer.nextLine()).isEmpty()) {
        // System.out.println(reply1);
        System.out.println(reply);// print reply to screen
    }
 }
 public static void checkAvailability(String developerName) {
    try {
        toServer.println(3);
        System.out.println("Send Developer Name to Find Availability: 
       ");
        String quoteDel = developerName;
        toServer.println(quoteDel);
        while (!(reply = fromServer.nextLine()).isEmpty()) {
            // System.out.println(reply1);
            System.out.println(reply);// print reply to screen
        }
    } catch (NoSuchElementException e) {
    }
   }

  public static void hireDeveloper(String name) {
    toServer.println(4);
    String quoteNum = name; //Search for a specific coding language - 
   Specific to the entered parameters
    System.out.println("Searching for: " + name + " in Developer 
   Database");
    toServer.println(quoteNum);
    while (!(reply = fromServer.nextLine()).isEmpty()) {
        // System.out.println(reply1);
        System.out.println(reply);// print reply to screen
    }
    fromServer.nextLine();     // Consume the newline
    System.out.println();

  }

  public static void printAllDevelopers(){
    toServer.println(5);
    while (!(reply = fromServer.nextLine()).isEmpty()) {
        // System.out.println(reply1);
        System.out.println(reply);// print reply to screen
    }
    fromServer.nextLine();     // Consume the newline
    System.out.println();

  }

    public static void clientMenu(){

    try {
        port = 4444; // 17 for localhost
        echoSocket = new Socket(remoteServer, port);
        fromServer = new Scanner(echoSocket.getInputStream());
        fromServer1 = new Scanner(echoSocket.getInputStream());
        toServer = new PrintWriter(echoSocket.getOutputStream(), true);
        toServer1 = new PrintWriter(echoSocket.getOutputStream(), 
     true);
        OutputStream os = echoSocket.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);


    } catch (Exception e) {
        System.err.println("Exception: " + e);
        System.exit(1);
    } // try-catch

    String reply;// holds reply from remote host
    int command;
    String reply1;
    String devName="David Blaine";
    String devSkill="Java";

    System.out.println("Enter command: 1:Search Skill    2:Add 
  Developer   3:Search Availability    4:Hire Developer    5:Show all 
  Developers   6:Exit");

    command = 0;
    command = command+1;

   // while (command != 0) {
  for(int i=1;i<6;i++) {
  command=i;
  switch (i) {
    case 1: {
        // get quote
        searchForSkill("PHP");
        break;
    }
    case 2: {
        // add quote
        addDeveloper("David Blaine", "Java", true);
        break;
    }
    case 3: {
        // delete quote
        checkAvailability("David Ferguson");
        break;
    }
    case 4: {
        hireDeveloper("Thompson");
        break;
    }
    case 5: {
        printAllDevelopers();
    }
    case 6: {
        System.exit(6);
    }
    default:
        System.out.println("*** Command not recognised ***");
        break;
}
System.out.println("Enter command: 1:Search Skill    2:Add Developer   
3:Search Availability    4:Hire Developer    5:Show all Developers   
6:Exit");
command = stdIn.nextInt();
//}
}
toServer.println(command);
try {
    echoSocket.close();
} catch (IOException e) {
    e.printStackTrace();
}
fromServer.close();
toServer.close();
stdIn.close();

}
public static void main(String[] args) throws IOException {
 clientMenu();







 } // main
 } // EchoClient

Server code:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class QuoteOfTheDayServer_2 {
    private static DeveloperDatabase[] developerList = new 
DeveloperDatabase[7];
    static DeveloperDatabase temp []=new DeveloperDatabase[7];

    static String userAddDevName;
    static String userAddCodeSkills;
    static Boolean userAddHireAvailability;
    static int command;

    static List<DeveloperDatabase> list = new 
 ArrayList<DeveloperDatabase>(){

        {
            add(new DeveloperDatabase(1,"David Ferguson", "Java", 
 true));
            add(new DeveloperDatabase(2,"Grant Thompson", "Java", 
 true));
            add(new DeveloperDatabase(3,"Craig Jackson", "C++", true));
            add(new DeveloperDatabase(4,"Kevin James","C++", true));
            add(new DeveloperDatabase(5,"Greg Troupe", "Python", 
 true));
            add(new DeveloperDatabase(6,"James Smith", "Python", 
 true));
            add(new DeveloperDatabase(7,"Jamie Richie", "PHP", true));
            add(new DeveloperDatabase(8,"Rory McGrattan", "PHP", 
 false));
        }

    };

    public static String printJava(){
        String message="";
        for (int i=0;i<2;i++){
            message +=list.get(i).toString();
            message+=" \n";

        }
        return message;
    }
    public static String printC(){
        String message="";
        for (int i=2;i<4;i++){
            message +=list.get(i).toString();
            message+=" \n";

        }
        return message;
    }
    public static String printPy(){
        String message="";
        for (int i=4;i<6;i++){
            message +=list.get(i).toString();
            message+=" \n";

        }
        return message;
    }
    public static String printPHP(){
        String message="";
        for (int i=6;i<8;i++){
            message +=list.get(i).toString();
            message+=" \n";

        }
        return message;
    }

    public static void addDeveloper(String name,String 
codeSkill,Boolean hire){
        userAddDevName=name;
        userAddCodeSkills = codeSkill;
        userAddHireAvailability = hire;
        System.out.println("*********Adding Developer***********");
        System.out.println(userAddDevName+ " has been added to the 
system");
        list.add(new DeveloperDatabase(9, 
userAddDevName,userAddCodeSkills, userAddHireAvailability));
        System.out.println(list.get(8));
    }//addDeveloper

    public static String checkAvail(String clientMessage){
        String message="";
        for (int i=0;i<list.size();i++){
            if 
(clientMessage.equalsIgnoreCase(list.get(i).getDeveloperName())) {
                message+= list.get(i).toString();
                message+="\n";
            }
        } return message;
    }
    public static String printAllDevelopers(){
        String message="";
        for (int i=0;i<8;i++){
            message +=list.get(i).toString();
            message+=" \n";

        }
        return message;
    }





    public static void main(String[] args) throws IOException {




        // Wrap the standard System.in stream with a Scanner so that
        Scanner stdIn = new Scanner(System.in);
        Scanner fromClient = null;
        PrintWriter toClient = null;
        PrintWriter toClient1=null;

        int pNum = 4444;
        ServerSocket sSocket = null;
        Socket cSocket = null;

        try {
            sSocket = new ServerSocket(pNum);
        } catch (IOException e) {
            System.out.println("Couldn't listen on port: " + pNum + "; 
" + 
    e);
            System.exit(1);
        }

        // Continuously wait for client; accept them; and send a quote 
to 
    them.
        while (true) {
            try {
                System.out.println("Waiting for client ....");
                // Blocking 'accept' i.e. wait for a client
                cSocket = sSocket.accept();
                System.out.println("Client connected from: " + 
    cSocket.getInetAddress());

                // Set up the output stream for the server, i.e. a 
    PrintWriter stream
                toClient = new PrintWriter(cSocket.getOutputStream(), 
    true);
                toClient1 = new PrintWriter(cSocket.getOutputStream(), 
    true);

                ObjectInputStream ois = new 
     ObjectInputStream(cSocket.getInputStream());
                fromClient = new Scanner(cSocket.getInputStream());
                try {
                    command = fromClient.nextInt();
                    //fromClient.nextLine();
                } catch (InputMismatchException e){
                    System.out.print("Your selection can only be an 
     integer!");
                }

                System.out.println("Received command: " + command + " 
 from 
     client at " + cSocket.getInetAddress());

                while (command != 0) {
                    switch (command) {
                        case 1: // get skills
                        {
                            System.out.println("GET skill");
                            fromClient.nextLine();
                            String quoteNum = 
     fromClient.nextLine();//receive from client
                            if (quoteNum.equalsIgnoreCase("Java")) {
                                toClient1.println(printJava());
                            } else if 
 (quoteNum.equalsIgnoreCase("C++")) {
                                toClient1.println(printC());
                            } else if 
 (quoteNum.equalsIgnoreCase("Python")) 
    {
                                toClient.println(printPy());
                            } else if 
  (quoteNum.equalsIgnoreCase("PHP")) {
                                toClient.println(printPHP());
                            }
                            else {
                                toClient.println("No developer with 
  those 
    skills found");
                            }
                            // 
    toClient.println(list.equals("Java"));//number -1 for array (0) to 
    client print
                            System.out.println("Pushed Developer 
  number: " 
    + quoteNum + " to client at " + cSocket.getInetAddress());
                            //toClient.println(quotes[quoteNum]); // 
  return 
    quote          //if "java' { get(0)   get(1)
                            break;
                        }
                        case 2: // add quote
                        {
                            System.out.println("ADD Developer to 
  System");
                            fromClient.nextLine();   // flush newline
                            String quote = fromClient.next();
                            fromClient.nextLine();
                            String quote1 = fromClient.next();
                            fromClient.nextLine();
                            boolean quote2 = fromClient.nextBoolean();

  toClient.println("The\t*************Developer 
    has been Added to the Developer Database********");
                            list.add(new DeveloperDatabase(9, quote, 
    quote1, quote2));
                            toClient.println(list.get(8).toString());
                            //addDeveloper(quote,quote1,quote2);
                            System.out.println(list.get(8));
                            //System.out.println("Received quote from 
    client:" + quote);
                            quote = quote + "\n\n";
                            //list.add((quote);
                            System.out.println("Added Developer: " + 
    quote);
                            break;
                        }
                        case 3: // Check if Developer is available
                        {
                            System.out.println("Check if developer is 
    Available\n");
                            fromClient.nextLine();
                            String quoteNum = fromClient.nextLine();
                            System.out.println("Checking availability 
  for: 
    " + quoteNum);
                            if (quoteNum.equalsIgnoreCase("Rory 
    McGrattan")) {
                                toClient.println("The Developer is not 
    available for hire");
                            } else {
                                toClient.println("The Developer is 
    available for hire");
                            }break;
                        }case 4: {
                            System.out.println("Hire A Developer");
                            String quoteNum =fromClient.next();
                            System.out.println("Client wants to hire: 
    "+quoteNum);
                            String message = quoteNum;
                            for(int i=0;i<list.size();i++){
                            if 
    (quoteNum.equalsIgnoreCase(list.get(i).getDeveloperName())){
                                    list.get(i).hireDeveloper();
                                }//if
                            }//if
                            //System.out.println(message);
                            toClient.println("******* You have Hired: 
 "+ 
     message+" ********");
                            break;
                        }
                        case 5: {// Print all Developers
                            String message="";
                            for (int i=0;i<8;i++){
                                message +=list.get(i).toString();
                                message+=" \n";
                            }
                            toClient.println(message);
                        }
                        default:
                                break;

            }
            try {
                //command = fromClient.nextInt();
            }catch(InputMismatchException e){
            }
                    System.out.println("Received command: " + command + 
    "from client at " + cSocket.getInetAddress());
                }
                // Close all streams
                toClient.close();
                cSocket.close();
                fromClient.close();
                stdIn.close();
            } catch (IOException e) {
                System.out.println("Accept failed: " + pNum + "; " + 
 e);
                System.exit(1);
            }
        }
    } // main
    } // QuoteOfTheDayServer_2

DeveloperDatabase code:

public class DeveloperDatabase {
private  int id;
private  String developerName;
private  String codingLanguage;
private  boolean freeForHire;

public  DeveloperDatabase(){

}

public  DeveloperDatabase(int id,String name,String codeSkills,boolean 
hire){
    this.id = id;
    this.developerName = name;
    this.codingLanguage=codeSkills;
    this.freeForHire=hire;
}


public String toString() {
    String message = "\tName: " +developerName;
    message += "\n" + "\tCoding Language:  "+ codingLanguage+"\n";

    if (freeForHire== true) {
        message += "\tThe developer is Available! for Hire!\n";
    } else {
        message += "\tThe developer is not Available for Hire!\n";
    }

    return message;
}//toString


public boolean getFreeForHire() {

    if (freeForHire==true){
        System.out.println("The Developer is free to hire!");
    }else{
        System.out.println("The Developer is not free to hire!");
    }
    return freeForHire;

 }

public  String getCodingLanguage() {
    return codingLanguage;
 }

public void hireDeveloper(){
    if (freeForHire==true)
        freeForHire = false;
        System.out.println(developerName +" is Hired!");
    }

public String getDeveloperName() {
    return developerName;
}

public static void main(String[] args) {

}//main
}//class   
  • 1
    Can you please help me understand your problem; where are you stuck – Saurabh Jhunjhunwala May 07 '18 at 10:57
  • Ok so basically this is a single client program - only one client connects to the server and carries out all the tasks within the switch statement. - How do i modify this so that i can have multiple clients connected to the server(as threads) and these clients or threads carry out the tasks in the client switch statement and once this is done the threads stop - i need help with implementing this situation - any help is much appreciated thanks – Grant Troupe May 07 '18 at 11:01
  • Are you trying to parallelize the server code, the client code or both? (Also this might help: https://docs.oracle.com/javase/tutorial/essential/concurrency/) – sirius May 07 '18 at 11:04
  • @sirius - im not 100% what you mean by that, if you are referring to if I want the task to execute simultaneously or each task running as a separate thread then yes that would be around the line of what I'm looking - maybe creating multiple client threads to carry out sperate tasks such as searchForSkill and another one carrying out addDeveloper for example - so multiple streams connecting to the server – Grant Troupe May 07 '18 at 11:13
  • @SaurabhJhunjhunwala any ideas? – Grant Troupe May 07 '18 at 11:32
  • Does https://stackoverflow.com/questions/15541804/creating-the-serversocket-in-a-separate-thread answer your question? – tgdavies May 07 '18 at 12:31
  • @tgdavies hmm not really as im having trouble understanding it, is there anyway you can explain it – Grant Troupe May 07 '18 at 13:40
  • Just to be clear on what you want: You don't want to modify the clients, but you want the server to be able to accept multiple concurrent client connections, so that before the first client has finished, another client connection can be accepted. Is that correct? – tgdavies May 07 '18 at 23:49

1 Answers1

0

you could use something like //define executor service to have 5 thread

1)

ExecutorService service=Executors.newFixedThreadPool(5);

2) //replace move code insde while (command != 0) into a separate class that implements runnable, lets call this Task.

public class Task implements Runnable{

private final Integer command;

public  Task(Integer command) {
    this.command=command;
}
@Override
public void run() {
    //do something, like switch statement 

}

}

3) create a helper method, and call this method

public void process(Task t){
        service.submit(t);
    }
tsingh
  • 231
  • 1
  • 2
  • 14