首先让我说我知道这是很多代码,所以请耐心等待。我正在开展一个项目,我将Oracle's Knock-Knock client/server示例移植到美国的State-Capital示例中。因此,它不是KnockKnock的笑话,而是运行一系列的州资本查询。它大致如下:
服务器:我是否有权向您发送州资本查询?
客户:好的
服务器:给我一个州,所以我可以寄一个资金?
客户:阿拉巴马州
服务器:阿拉巴马州的首府是亨斯特维尔。想要另一个(是/否)?
客户:n
执行此项目的动机是稍后演示某种类型的故障安全功能(在我开始工作之后,我想使用Powershell并使用它来将客户端 - 服务器作为一个单元运行)。
回到我的代码。当我运行它时,它会给我以下输出,这不是我想要的。它应该是同步的,以便客户端和服务器一次处理一个状态。相反,客户端跳过服务器端,并且它没有到达怀俄明州的最后状态。我尝试添加一些同步as per this question。
我已经在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
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
类)发送查询的速度可能过快,可能是{{1}内部的IO是一个瓶颈。
有关如何调试或计算出来的任何提示都表示赞赏,谢谢
答案 0 :(得分:4)
无需新的答案。感谢上面的Paul,鼓励我自己解决这个问题:
问题是,我忽略了<xsl:value-of select="document('udata://custom/gettimedata/')/udata" disable-output-escaping="yes"/>
类
由于客户端是硬编码的,用于发送大型FixedSequenceMessageProtocol
数组中的所有内容,因此需要为“ack”(理想情况下应该是多维数组)提供第四个字段,该字段与服务器的发送配对“nowlogged”:
StateResponses
在此之后,在StateResponses[] = { "Permission granted." , "What is Alabama population", "y", "ack", //00
"Permission granted." , "What is Alaska population", "y", "ack",
类中,我添加了一个新的常量final变量,以便在我们记录状态位置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;
类的嵌套if块中添加另一个案例:
FixedSequenceMessageProtocol