Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Server Guessing Game

Tags:

java

repeat

I'm creating a server where clients connect to play a guessing game they are also to get points from doing this.

My only problem at the moment is that whenever my client guesses the number correctly it jumps to the server and says 'server null'. I want the guessing game to continue until the client inputs 'goodbye' - on which his/her score is given.

Here is my code could you point out where I've gone wrong and advise me on how I would achieve what I want. I think the problem is in protocol I probably just need to put the while in the correct place, so that's up first. Thanks folks! Just to add, the variables are named oddly I'm aware of this it was previously a knock knock joke server

Protocol

import java.util.*;

        public class KKProtocol {
    int guess = 0, number = new Random().nextInt(100) + 1;
    int score = 0;
    Scanner scan = new Scanner(System.in);


    public String processInput(String theInput) {
        String theOutput = null;

        System.out.println("Please guess the number between 1 and 100.");

        while (guess != number) {
          try {
            if ((guess = Integer.parseInt(scan.nextLine())) != number) {
              System.out.println(guess < number ? "Higher..." : "Lower...");
            }
            else {
              System.out.println("Correct!");
              score = 1;
            }
          }   
          catch (NumberFormatException e) {
            System.out.println("Please enter a valid number! If you want to Quit just say'Goodbye'");
          }   

        }   



        return theOutput;   
    }}

Server

import java.net.*;
import java.io.*;

public class KKServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;
        try {
            serverSocket = new ServerSocket(4040);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4040.");
            System.exit(-1);
        }
        System.err.println("Started KK server listening on port 4040");
        while (listening)  
            new KKThread(serverSocket.accept()).start();
            System.out.println("Accepted connection from client");
            serverSocket.close();
        }
}

Thread

import java.net.*;
import java.io.*;
import java.util.Scanner;

public class KKThread extends Thread {
    private Socket mySocket = null;

    public KKThread(Socket inSocket) {           //super("KKThread");
        mySocket = inSocket;
    }
    public void run() {

        try {
            PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true);
            Scanner in = new Scanner(mySocket.getInputStream());

            String inputLine, outputLine;
            KKProtocol kkp = new KKProtocol();

            outputLine = kkp.processInput(null);        // first time only
            out.println(outputLine);        // (Should be "Knock Knock")

            while (true) {
                inputLine = in.nextLine();                  // read in client input
                outputLine = kkp.processInput(inputLine);   // get reply from protocol
                out.println(outputLine);                    // send it out to socket
                if (outputLine.equals("Bye"))
                    break;
            }
            out.close();
            in.close();
            mySocket.close();

        } catch (Exception e) {
            System.err.println("Connection reset");  //e.printStackTrace();
        }
    }
}

Client

import java.io.*;
import java.net.*;
import java.util.Scanner;

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

        Socket kkSocket = null;
        PrintWriter out = null;
        Scanner in = null;

        try {
            kkSocket = new Socket("127.0.0.1", 4040);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new Scanner(new InputStreamReader(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection");
            System.exit(1);
        }
        Scanner stdIn = new Scanner(System.in);
        String fromServer = in.nextLine();
        while (true) {
            System.out.println("Server: " + fromServer);
            if (fromServer.equals("Bye."))
                break;
            out.println(stdIn.nextLine());
            fromServer = in.nextLine();
        }
        out.close();
        in.close();
        stdIn.close();
        kkSocket.close();
    }
}
'

Why does it jump to the server and says 'server null'? How do I continue the guessing until the client inputs 'goodbye'?

like image 604
James Avatar asked Dec 16 '12 16:12

James


2 Answers

You are currently not assigning the server response for the score in KKProtocol.processInput() so a null is returned instead resulting in the message that you see:

Server: null

You could use:

theOutput = Integer.toString(score);

Also your score is fixed at 1 so you may wish to devise a scoring system perhaps based on the number of guesses used.

like image 182
Reimeus Avatar answered Oct 17 '22 12:10

Reimeus


In you processInput()method, you are not returning any value, but allways null. It looks like that null value is transformed into the String "null" on output and sent to the client.

like image 40
Udo Klimaschewski Avatar answered Oct 17 '22 14:10

Udo Klimaschewski