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.
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.