2011-11-18 85 views
1

我会尽力详细解释我的问题。随意问你是否需要更多细节。从Java中的套接字BufferedReader.readLine()卡住

我有一个多客户端/服务器连接通过Java套接字进行线程化。所有交易所都按照协议进行简单的案例分析。 searchFlight(destination,date)方法查询SQL数据库(抱歉,我无法提供它)并返回ResultSet变量。然后,方法displaySelected(ResultSet)将ResultSet作为字符串逐行发送到客户端。

直到服务器向客户端发送“小时”,通信才能正常工作。我监视了服务器上的值,看起来服务器向客户端发送了正确的字符串(应该是“Flight hour(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(); 
     } 
    } 
} 

回答

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(..)

+0

Hour输入!非常感谢!它现在正在完美地工作=) – Julien