[英]How to make my Java Swing application a Client-Server application?
[英]How do I make my automated Client-Server Java networking code output in the correct sequence?
首先让我说我知道这是很多代码,所以请耐心等待。 我正在一个项目中,正在将Oracle的Knock-Knock客户端/服务器示例移植到美国State-Capital示例中。 因此,它运行一系列状态资本查询,而不是KnockKnock笑话。 它大致运行如下:
服务器:我是否可以向您发送州名查询?
客户:好的
服务器:请向我发送州名,这样我可以向您发送资金?
客户:阿拉巴马州
服务器:阿拉巴马州的首都是汉斯维尔。 需要另一个(y / n)吗?
客户:n
进行此项目的动机是稍后演示某种类型的故障保护功能(在我使它起作用之后,我想使用Powershell并使用该功能以单个单元运行客户端服务器)。
回到我的代码。 当我运行它时,它会给我以下输出,这不是我想要的。 它应该是同步的,以便客户端和服务器一次处于一种状态。 相反,客户端正在跳到服务器端,并且没有达到怀俄明州的最后状态。 我试图根据这个问题添加一些同步。
我已将完整代码链接到pastebin
在代码中,我正在使用一个简单的整数整数文本日志文件:
1
2
3
4
注意:我正在使用Apache ReversedLinesFileReader库。
我怀疑我的错误是由于Java IO编写花费的时间太长。 我认为可能是由于以下代码块:
for (int i = modlastNum; i < KKJokes.length ; i++){ String fromServer = br.readLine(); out.println(KKJokes[ i % KKJokes.length ]); if ( (i % 3 )==2){ try { Thread.sleep(11); } catch (InterruptedException ie) {} } // fromServer = br.readLine(); System.out.println ( fromServer ); fromServer = br.readLine(); System.out.println ( fromServer ); // String fromServer3 = br.readLine(); System.out.println ( fromServer3 ) ; System.out.println ( fromServer ) ; if(fromServer.equals("inputOfYes")){ while (!(fromServer.equals("nowlogged"))) { fromServer = br.readLine(); } } System.out.println ( fromServer ) ; } // end-forLoop starting at Ln. 93
所以我的直觉是,我自动发送的查询到FixedMessageSequenceServer
类(通过的方式FixedMessageSequenceProtocol
类)也许是走得太快,也许IO内的FixedMessageSequenceClient
是一个瓶颈。
感谢有关如何调试或解决任何技巧
无需新答案。 感谢上面的保罗,鼓励我自己解决这个问题:
问题是,我忽略了FixedSequenceMessageProtocol
类的重要性
由于客户端经过硬编码后可以在大型StateResponses
数组中发送所有内容,因此需要为“ ack”(理想情况下为多维数组)添加第四个字段,该字段与服务器的“ nowlogged”发送配对:
StateResponses[] = { "Permission granted." , "What is Alabama population", "y", "ack", //00
"Permission granted." , "What is Alaska population", "y", "ack",
之后,在FixedSequenceMessageProtocol
类中,我添加了一个新的常量最终变量,以表示在我们记录状态位置SENTPERMISSION2
后的未决状态:
private static final int WAITING = 0;
private static final int SENTPERMISSION = 1;
private static final int SENTPERMISSION2 = 2; // ** new line
private static final int SENTCLUE = 3;
private static final int ANOTHER = 4;
接下来,我只需要在FixedSequenceMessageProtocol
类的nested-if块中添加另一种情况:
/* etc more code */ {
if (theInput.equalsIgnoreCase(clues[currentPopulationRequest])) {
theOutput = answers[currentPopulationRequest] + " Want another? (y/n)";
currentPopulationRequest++;
state = SENTPERMISSION2 ; //sentpermssion2, & in sentPermission2 put another
} else {
theOutput = "You're supposed to say \"" +
clues[currentPopulationRequest] +
"! Try again. Request to send a state population";
state = SENTPERMISSION;
}
}
else if (state == SENTPERMISSION2) {
if (theInput.equalsIgnoreCase("y")) {
theOutput = "Status logged";
state = ANOTHER;
} else {
theOutput = "Bye.";
state = WAITING;
}
}
else if (state == ANOTHER) {
if (theInput.equalsIgnoreCase("ack")) { /* etc more code */
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.