【问题标题】:How to get input from Console in Java Client Server Program如何在 Java 客户端服务器程序中从控制台获取输入
【发布时间】:2015-10-09 21:47:40
【问题描述】:

我写了一个简单的客户端服务器程序。我能够将文本从客户端发送到服务器,反之亦然。但是在客户端打印了服务器的数据后,我无法在客户端的 CLI 上打印任何内容。

我不确定我做错了什么。我怀疑注释为“Bug Here”的行中的错误。我找不到这些行有什么问题。

请在下面找到我的代码。

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

输出:

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$

你能帮我弄清楚如何在客户的控制台上获得输入吗?谢谢。

【问题讨论】:

    标签: java sockets client-server


    【解决方案1】:

    只要来自远程套接字的输入流是打开的, bread.readLine() 永远不会返回 null, 因此这个循环永远不会结束:

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

    您需要添加某种信号,例如文本“ENDMSG”。服务器应该在完成与客户端的通话后发送此消息,并且客户端应该将其识别为这样,并退出循环。例如:

    while((data = bread.readLine()) != null)
    {
        if (data.equals("ENDMSG")) {
            break;
        }
        System.out.println(data);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多