我会尽力详细解释我的问题。如果您需要更多详细信息,请随时询问。
我有一个由Java套接字线程化的多客户端/服务器连接。所有交换机都根据协议按照简单的具体情况进行操作。方法searchFlight(destination,date)查询SQL数据库(抱歉我无法提供)并返回ResultSet变量。然后,方法displaySelected(ResultSet)逐行将ResultSet作为String发送到客户端。
通信工作正常,直到服务器将“小时”发送给客户端。我监视服务器上的值,看起来服务器将正确的字符串发送到客户端(应该是“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#):
我现在坚持这个问题几天了,我真的不知道如何修复它。 我尝试了很多替代方案而没有成功。我希望有人比我更有经验的人可以帮助我。
提前谢谢。
你可以看到我的所有代码。
客户端
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();
}
}
}
答案 0 :(得分:1)
这是问题所在。在客户端,当您正在阅读航班/时间表列表时,对于您从服务器读取的每行仅显示数据,您将发送用户输入的先前输入到服务器。这就是它继续打印City
的原因,因为客户端会继续发送为2
选项收集的encampment or city
。
替换
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;
}
除此之外,您还需要处理Hour
Protocol.process(..)
输入