2

I have written a simple client server program. I am able to send text from client to server and vice-versa. But after printing the Server's data on the client, I am not able to print anything on the Client's CLI.

I am not sure what I am doing wrong. I suspect bug in the lines commented "Bug Here". I am unable to find what is wrong in those lines.

Please find my code below.

ATMClient.java

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

public class ATMClient
{
    public static void main(String args[])
    {
        try
        {
            Socket sock = new Socket("localhost", 9010);
            sock.setSoTimeout(10000);
            System.out.println("Connection established");
            String data = null;

            InputStreamReader input = new InputStreamReader(sock.getInputStream());
            BufferedReader bread = new BufferedReader(input);

            BufferedReader brCli = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Enter text to be sent to Server: ");
            String strCli = brCli.readLine();

            PrintWriter pwrite = new PrintWriter(sock.getOutputStream(), true);
            pwrite.println(strCli);

        // Bug Here: The control in not coming out of the while loop
            while((data = bread.readLine()) != null)
            {
                System.out.println(data);
            }

        // Bug Here: The following line does not get printed.
            System.out.print("Enter an Option: ");

            pwrite.close();
            bread.close();
            input.close();
        }
        catch(IOException ex)
        {
            System.err.println(ex);
        }
    }
}

ATMServer.java

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

public class ATMServer
{
    public static void main(String args[])
    {
        try
        {
            ServerSocket server = new ServerSocket(9010);
            Socket client = server.accept();
            System.out.println("Connection Established");

            InputStream input = client.getInputStream();
            BufferedReader bufread = new BufferedReader(new InputStreamReader(input));

            PrintWriter pwrite = new PrintWriter(client.getOutputStream(), true);

            pwrite.println("1. Deposit");
            pwrite.println("2. Withdrawal");
            pwrite.println("3. Balance");
            pwrite.println("4. Exit");

            String data = null;
            while((data = bufread.readLine()) != null)
            {
                System.out.println(data);
            }

            pwrite.close();
            bufread.close();
            input.close();
            server.close();
            client.close();
        }
        catch(Exception ex)
        {
            System.err.println(ex);
        }
    }
}

Output:

user1$ java ATMServer
Connection Established
hello

user1$ java ATMClient
Connection established
Enter text to be sent to Server: hello
1. Deposit
2. Withdrawal
3. Balance
4. Exit
Deposit
^C user1$

Can you help me in figuring out how to get an input on Client's console ? Thanks.

Anit
  • 345
  • 1
  • 5
  • 19

1 Answers1

3

As long as the input stream from the remote socket is open, bread.readLine() will never return null, and therefore this loop will never end:

while((data = bread.readLine()) != null)
{
    System.out.println(data);
}

You need to add some kind of signal, for example the text "ENDMSG". The server should send this when it's done talking to the client, and the client should recognize it as such, and exit from the loop. For example:

while((data = bread.readLine()) != null)
{
    if (data.equals("ENDMSG")) {
        break;
    }
    System.out.println(data);
}
janos
  • 120,954
  • 29
  • 226
  • 236