Im working on a program that plays a guessing game with a se

I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially they fail after the first one. I believe this is caused by the .accept(); but I\'m not sure how to fix it. Here is my code.

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class GuessingServer {
public static void main(String[] args)
{
try{
ServerSocket server;

server = new ServerSocket( 5150 );
System.out.println(\"awaiting client...\");
System.out.println(\"client connected\");
Socket client = server.accept();
Scanner in = new Scanner ( client.getInputStream() );
PrintWriter out = new PrintWriter( client.getOutputStream(), true );
String first = in.next();
int high = in.nextInt();
int low = Integer.parseInt(first);

boolean serverRun = true;

while(serverRun == true)
{

  
if(!first.equals(\"SHUT DOWN\"))
{
System.out.println(low);
System.out.println(high);

int bNum = ((high - low) / 2) + low;
out.println(bNum);
System.out.println(bNum);
String temp = in.next();

if(temp.equals(\"high\"))
{
high = bNum;
System.out.println(temp + \": \");
System.out.println(high);

}
else if(temp.equals(\"low\"))
{
low = bNum;
System.out.println(temp + \": \");
System.out.println(low);
  
}
else if(temp.equals(\"won\"))
{
System.out.println(temp);
serverRun = false;
}
else if(temp.equals(\"lost\"))
{

System.out.println(temp);
serverRun = false;
}
  
}
else
{
serverRun = false;
}
}
client.close();
in.close();
out.close();
server.close();
}
catch(IOException e)
{
}
}
}

and here are my test cases:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.net.Socket;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.Scanner;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class GuessingServerTest {
   @Test
   public void testReflection() {
       Class<?> iClass = GuessingServer.class;
       Field[] iFields = iClass.getDeclaredFields();

       for (Field f : iFields) {
           if (!f.isSynthetic()) {
               assertTrue ( \"Field \\\"\"+f.getName()+\"\\\" should be private\", Modifier.isPrivate( f.getModifiers() ));
               assertFalse( \"Field \\\"\"+f.getName()+\"\\\" can\'t be static\", Modifier.isStatic ( f.getModifiers() ));
           }
       }
   }

   @BeforeClass
   public static void startServer() {
       // run server
       Thread thread = new Thread(new Runnable() {
           @Override
           public void run() {
               GuessingServer.main( new String[]{ } );
           }
       });
       thread.start();
   }
   @Before
   public void waitTwoSecondsBetweenTests() {
       try {
           Thread.sleep( 2000 );
       }
       catch (InterruptedException e) {
           e.printStackTrace();
       }
   }

   @Test(timeout=3000)
   public void testA_WinningAfter1Try() {
       try {
           // run client
           Socket socket = new Socket( \"localhost\", 5150 );
           Scanner scanner = new Scanner ( socket.getInputStream() );
           PrintWriter writer = new PrintWriter( socket.getOutputStream(), true );

           writer.println( \"101 401\" );
           // try 1
           int actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 251, actual );

           writer.println( \"won\" );

           socket .close();
           scanner.close();
       }
       catch (IOException e) {
           e.printStackTrace();
           fail( \"Error opening client socket\" );
       }
       catch (NoSuchElementException e) {
           e.printStackTrace();
           fail( \"The server didn\'t return a value\" );
       }
   }

   @Test(timeout=3000)
   public void testB_WinningAfter2Tries() {
       try {
           // run client
           Socket socket = new Socket( \"localhost\", 5150 );
           Scanner scanner = new Scanner ( socket.getInputStream() );
           PrintWriter writer = new PrintWriter( socket.getOutputStream(), true );

           writer.println( \"37 337\" );
           // try 1
           int actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 187, actual );
           writer.println( \"low\" );
           // try 2
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 262, actual );
           writer.println( \"high\" );
           // try 3
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 224, actual );
           writer.println( \"high\" );
           // try 4
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 205, actual );
           writer.println( \"low\" );
           // try 5
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 214, actual );
           writer.println( \"high\" );
           // try 6
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 209, actual );
           writer.println( \"high\" );
           // try 7
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 207, actual );
           writer.println( \"high\" );
           // try 8
           actual = scanner.nextInt();
           assertEquals( \"Incorrect result\", 206, actual );
           writer.println( \"won\" );

           socket .close();
           scanner.close();
       }
       catch (IOException e) {
           e.printStackTrace();
           fail( \"Error opening client socket\" );
       }
       catch (NoSuchElementException e) {
           e.printStackTrace();
           fail( \"The server didn\'t return a value\" );
       }
   }

   @Test(timeout=3000)
   public void testC_PlayingARandomGame() throws IOException {
       final int UPPER = 200;
       final int RANGE = 300;
       final int TRIES = 9;

       final Random random = new Random();
       try {
           // run client
           Socket socket = new Socket( \"localhost\", 5150 );
           Scanner scanner = new Scanner ( socket.getInputStream() );
           PrintWriter writer = new PrintWriter( socket.getOutputStream(), true );

           int low = random.nextInt( UPPER );
           int hi = low + RANGE;
           int number = low + random.nextInt( RANGE );

           writer.println( low + \" \" + hi );

           int tries = 0;
           boolean gameOver = false;

           while (!gameOver) {
               int guess = scanner.nextInt();
               if (guess == number) {
                   writer.println( \"won\" );
                   gameOver = true;
               }
               else {
                   if (++tries > TRIES) {
                       writer.println( \"lost\" );
                       gameOver = true;
                   }
                   else {
                       if (guess < number) {
                           writer.println( \"low\" );
                       }
                       else {
                           writer.println( \"high\" );
                       }
                   }
               }
           }
           socket .close();
           scanner.close();
       }
       catch (IOException e) {
           e.printStackTrace();
           fail( \"Error opening client socket\" );
       }
       catch (NoSuchElementException e) {
           e.printStackTrace();
           fail( \"The server didn\'t return a value\" );
       }
   }

   @Test(expected = IOException.class)
   public void testD_RunsLast_ServerShutsDown() throws IOException {
       try {
           // running client #1...shuts down server
           Socket socket = new Socket( \"localhost\", 5150 );
           PrintWriter writer = new PrintWriter( socket.getOutputStream(), true );

           writer.println( \"SHUT DOWN\" );

           socket.close();
       }
       catch (IOException e) {
           e.printStackTrace();
           fail( \"Error opening client socket\" );
       }
       waitTwoSecondsBetweenTests();

       // running client #2...should throw exception (server should have stopped)
       new Socket( \"localhost\", 5150 ).close();
       fail( \"Socket should not connect after server was shut down\" );
   }
}

Solution

Client Class

import java.io.*;

import java.net.*;

public class GClient {

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

    Socket kkSocket = null;

    PrintWriter out = null;

    BufferedReader in = null;

    try {

      kkSocket = new Socket(\"127.0.0.1\", 4444);

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

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

    } catch (UnknownHostException e) {

        System.err.println(\"Don\'t know about host: taranis.\");

        System.exit(1);

    } catch (IOException e) {

        System.err.println(\"Couldn\'t get I/O for the connection to: taranis.\");

        System.exit(1);

    }

    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);

    }

    }

    out.close();

    in.close();

    stdIn.close();

    kkSocket.close();

}

}

Server Class

import java.net.*;

import java.io.*;

public class GServer {

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

    ServerSocket serverSocket = null;

    boolean listening = true;

    try {

        serverSocket = new ServerSocket(4444);

    } catch (IOException e) {

        System.err.println(\"Could not listen on port: 4444.\");

        System.exit(-1);

    }

    System.err.println(\"Started KK server listening on port 4040\");

    while (listening)

    new GThread(serverSocket.accept()).start();

    serverSocket.close();

}

}

Protocol Class

import java.util.*;

public class GProtocol {

int guess = 0, number = new Random().nextInt(100) + 1;

int score = 10;

int guessmade = 0;

boolean gameRunning = true;

Scanner scan = new Scanner(System.in);

public String processInput(String theInput) {

    String theOutput = null;

    String ID;

    System.out.println(\"Please Enter your ID...\");

    ID = scan.next( );

    System.out.println(\"Please guess the number between 1 and 100. You have 10 guesses. Your score is however many guesses you have left\");

    while (guess != number)

    {

        try {

        if ((guess = Integer.parseInt(scan.nextLine())) != number) {

          System.out.println(guess < number ? \"Higher...\" : \"Lower...\");

          score = score - 1; // here the score variable has one value taken away form it each time the user misses a guess

          guessmade = +1; // here the guess made variable is given +1 variable

        }

        else {

          System.out.println(\"Correct!\");

        }

        }

      catch (NumberFormatException e) {

        System.out.println(\"Please enter valid numbers! \'\");

      }   

    }  

    theOutput = ID + \" your score is \" + score ; // here the score is returned

    return theOutput;}}

Thread class

import java.net.*;

import java.io.*;

public class GThread extends Thread {

private Socket socket = null;

public GThread(Socket socket) {

super(\"GMultiServerThread\");

this.socket = socket;

}

public void run() {

try {

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

    BufferedReader in = new BufferedReader(

                new InputStreamReader(

                socket.getInputStream()));

    String inputLine, outputLine;

   GProtocol kkp = new GProtocol();

    outputLine = kkp.processInput(null);

    out.println(outputLine);

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

  outputLine = kkp.processInput(inputLine);

    out.println(outputLine);

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

        break;

    }

    out.close();

    in.close();

    socket.close();

} catch (IOException e) {

    e.printStackTrace();

}

}

}

I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially
I\'m working on a program that plays a guessing game with a server and a client class. When I run my tests individually they all pass but when run sequentially

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site