Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

The following code doesn\'t allow for multiple clients to connect simultaneously

ID: 3590619 • Letter: T

Question

The following code doesn't allow for multiple clients to connect simultaneously.Implement the KnockKnock Client/Server to now allow for multiple clients to connect to the server simultaneously.

Client-code

package com.cheggg;
import java.io.*;
import java.net.*;
public class KnockKnockClient {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println(
"Usage: java EchoClient <host name> <port number>");
System.exit(1);
}
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try (
Socket kkSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(kkSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(kkSocket.getInputStream()));
) {
BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye."))
break;
fromUser = stdIn.readLine();
if (fromUser != null) {
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
hostName);
System.exit(1);
}
}
}

Server-code

package com.cheggg;

import java.net.*;

import org.json.simple.parser.ParseException;

import java.io.*;

public class KnockKnockServer {
public static void main(String[] args) throws IOException, ParseException {
if (args.length != 1) {
System.err.println("Usage: java KnockKnockServer <port number>");
System.exit(1);
}
int portNumber = Integer.parseInt(args[0]);
try (
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
) {
String inputLine, outputLine;
// Initiate conversation with client
KnockKnockProtocol kkp = new KnockKnockProtocol();
outputLine = kkp.processInput(null);
out.println(outputLine);
while ((inputLine = in.readLine()) != null) {
outputLine = kkp.processInput(inputLine);
out.println(outputLine);
if (outputLine.equals("Bye."))
break;
}
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port "
+ portNumber + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}

protocol code

package com.cheggg;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.HashSet;

import java.util.Random;

import java.util.Set;

import org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import org.json.simple.parser.JSONParser;

import org.json.simple.parser.ParseException;

public class KnockKnockProtocol {

private static final int WAITING = 0;

private static final int SENTKNOCKKNOCK = 1;

private static final int SENTCLUE = 2;

private static final int ANOTHER = 3;

private static final int NUMJOKES = 5;

private int state = WAITING;

private int currentJoke = 0;

private String[] clues ;

private String[] answers ;

Random random = new Random();

Set<Integer> validate = new HashSet<>();

int index = 0;

  

KnockKnockProtocol() throws FileNotFoundException, IOException, ParseException{

//constructor to load json data

JSONParser parser = new JSONParser();

JSONArray a = (JSONArray) parser.parse(new FileReader("c:\test.json"));

System.out.println(a.size());

clues=new String[a.size()];

answers=new String[a.size()];

for (Object o : a)

{

JSONObject person = (JSONObject) o;

String cluejson = (String) person.get("clue");

clues[a.lastIndexOf(o)]=cluejson;

String answerjson = (String) person.get("answer");

answers[a.lastIndexOf(o)]=answerjson;

}

index=random.nextInt(clues.length);

currentJoke = index;

validate.add(index);

}

public String processInput(String theInput) {

String theOutput = null;

  

/* Add First Randomly Genrated Number To Set */

// validate.add(random.nextInt(clues.length));

  

  

if (state == WAITING) {

theOutput = "Knock! Knock!";

state = SENTKNOCKKNOCK;

} else if (state == SENTKNOCKKNOCK) {

if (theInput.equalsIgnoreCase("Who's there?")) {

theOutput = clues[currentJoke];

state = SENTCLUE;

} else {

theOutput = "You're supposed to say "Who's there?"! " +

"Try again. Knock! Knock!";

}

} else if (state == SENTCLUE) {

if (theInput.equalsIgnoreCase(clues[currentJoke] + " who?")) {

theOutput = answers[currentJoke] + " Want another? (y/n)";

state = ANOTHER;

} else {

theOutput = "You're supposed to say "" +

clues[currentJoke] +

" who?"" +

"! Try again. Knock! Knock!";

state = SENTKNOCKKNOCK;

}

} else if (state == ANOTHER) {

if (theInput.equalsIgnoreCase("y")) {

theOutput = "Knock! Knock!";

if (currentJoke == (clues.length - 1)){

currentJoke = index;

}

  

else{

//System.out.println("index:::"+index);

while(validate.contains(index)) {

index = random.nextInt(clues.length);

//System.out.println("generated index:::"+index);

}

//index = random.nextInt(clues.length);

validate.add(index);

currentJoke=index;

}

  

state = SENTKNOCKKNOCK;

} else {

theOutput = "Bye.";

state = WAITING;

}

}

return theOutput;

}

}

test.json

[{

"clue":"Turnip",

"answer":"Turnip the heat, it's cold in here!"

},

{

"clue":"Little Old Lady",

"answer":"I didn't know you could yodel!"

},

{

"clue":"Atch",

"answer":"Bless you!"

},

{

"clue":"Who",

"answer":"Is there an owl in here?"

},

{

"clue":"Who",

"answer":"Is there an echo in here?"

}]

Explanation / Answer

Hi... I have changed server code and added new class to handle multiple clients. Remaining code as same as you posted.

KnockKnockServer.java

package com.chegg;

import java.net.*;

import org.json.simple.parser.ParseException;

import java.io.*;

public class KnockKnockServer {

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

if (args.length != 1) {

System.err.println("Usage: java KnockKnockServer <port number>");

System.exit(1);

}

int portNumber = Integer.parseInt(args[0]);

ServerSocket serverSocket=null;

Socket clientSocket=null;

try {

serverSocket = new ServerSocket(portNumber);

} catch (IOException e) {

e.printStackTrace();

}

while(true){

try {

clientSocket = serverSocket.accept();

} catch (IOException e) {

System.out.println("I/O error: " + e);

}

// new thread for a client

new MultipleConnects(clientSocket).start();

}

/*} catch (IOException e) {

System.out.println(

"Exception caught when trying to listen on port " + portNumber + " or listening for a connection");

System.out.println(e.getMessage());*/

//}

}

}

MultipleConnects.java

package com.chegg;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

public class MultipleConnects extends Thread {

protected Socket clientSocket;

public MultipleConnects(Socket clientSocket) {

this.clientSocket = clientSocket;

}

  

public void run(){

try{

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

String inputLine, outputLine;

// Initiate conversation with client

KnockKnockProtocol kkp = new KnockKnockProtocol();

outputLine = kkp.processInput(null);

out.println(outputLine);

while ((inputLine = in.readLine()) != null) {

outputLine = kkp.processInput(inputLine);

out.println(outputLine);

if (outputLine.equals("Bye."))

break;

}

}catch(Exception e){

e.getMessage();

}

}

}

Please check it and let me know if any required.

Thank you. all the best.

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote