【问题标题】:BufferedReader.readLine() from a socket in Java stuck来自 Java 中的套接字的 BufferedReader.readLine() 卡住了
【发布时间】:2011-11-18 17:53:23
【问题描述】:

我将尝试详细解释我的问题。如果您需要更多详细信息,请随时询问。

我有一个由 Java 套接字线程化的多客户端/服务器连接。所有的交易所都根据协议在一个简单的案例基础上运行。方法 searchFlight(destination,date) 查询 SQL 数据库(抱歉我不能提供)并返回一个 ResultSet 变量。然后,displaySelected(ResultSet)方法将ResultSet作为String逐行发送给客户端。

在服务器将“小时”发送给客户端之前,通信正常。我监视了服务器上的值,似乎服务器向客户端发送了正确的字符串(应该是“飞行时间(HH:MM):”),但客户端只打印前一个。具体是这样卡住的:

(1) Make reservation | (2) Cancel reservation
1
Choose the departure date (YYYY-MM-DD):
2012-01-01
(1) Go to Encampment | (2) Go to City:
2
+------|-----------|------------|-------------|----------|-------+  
| Code | Company   | Dest       | Date        | Hour     | Seats |  
+------+-----------+------------+-------------+----------+-------+  
| AER2 | Aerocamp  | City       | 2012-01-01  | 07:00:00 | 5 /6  |  
| COP2 | CopterFly | City       | 2012-01-01  | 09:00:00 | 5 /6  |  
| AER1 | Aerocamp  | City       | 2012-01-01  | 10:00:00 | 3 /6  |  
| H001 | HeliAir   | City       | 2012-01-01  | 11:00:00 | 6 /6  |  
| COP1 | CopterFly | City       | 2012-01-01  | 11:00:00 | 6 /6  |  
| AER2 | Aerocamp  | City       | 2012-01-01  | 13:00:00 | 4 /6  |  
| COP2 | CopterFly | City       | 2012-01-01  | 15:00:00 | 2 /6  |  
| AER1 | Aerocamp  | City       | 2012-01-01  | 16:00:00 | 6 /6  |  
| COP1 | CopterFly | City       | 2012-01-01  | 17:00:00 | 2 /6  |  
| COP3 | CopterFly | City       | 2012-01-01  | 20:00:00 | 3 /6  |  
+------|-----------|------------|-------------|----------|-------+  
Flight code (XXX#):
AER1
Flight code (XXX#):

Flight code (XXX#):

我被这个问题困扰了几天,我真的不知道如何解决它。 我尝试了很多替代方案,但都没有成功。我希望比我更有 Java 经验的人可以帮助我。

提前谢谢你。

你可以在下面看到我的所有代码。


客户端

public class Client {

static Socket clientSocket = null;

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

        PrintWriter out = null;
        BufferedReader in = null;

        try {
            clientSocket = new Socket("localhost", 1024);
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.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);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromClient = null;

        try {
            while (((fromServer = in.readLine()) != null)) {

                System.out.println(fromServer);
                System.out.flush();     

                if(!fromServer.endsWith("  ")){
                    fromClient = stdIn.readLine();
                }

                if (fromClient != null) {
                    out.println(fromClient);
                    out.flush();
                }
                }

            out.close();
            in.close();
            stdIn.close();
            clientSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

    标签: java sockets resultset readline bufferedreader


    【解决方案1】:

    这就是问题所在。在客户端上,当您读取航班/时间表列表时,对于您从服务器读取的每一行仅显示数据,您将用户输入的先前输入发送到服务器。这就是它不断打印City 的原因,因为客户端不断发送它为选项encampment or city 收集的2

    替换

    if(!fromServer.endsWith("  ")){
        fromClient = stdIn.readLine();
    } 
    

    if(!fromServer.endsWith("  ")){
        fromClient = stdIn.readLine();
    } else {
        // Data from the server is for display only. No input is required.
        // Clear out previous input.
        fromClient = null;
    } 
    

    除此之外,您还需要处理Protocol.process(..) 中的Hour 输入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多