如何以正确的顺序生成自动化的客户端 - 服务器Java网络代码输出?

时间:2016-03-07 01:41:18

标签: java network-programming

首先让我说我知道这是很多代码,所以请耐心等待。我正在开展一个项目,我将Oracle's Knock-Knock client/server示例移植到美国的State-Capital示例中。因此,它不是KnockKnock的笑话,而是运行一系列的州资本查询。它大致如下:

  

服务器:我是否有权向您发送州资本查询?

     

客户:好的

     

服务器:给我一个州,所以我可以寄一个资金?

     

客户:阿拉巴马州

     

服务器:阿拉巴马州的首府是亨斯特维尔。想要另一个(是/否)?

     

客户:n

执行此项目的动机是稍后演示某种类型的故障安全功能(在我开始工作之后,我想使用Powershell并使用它来将客户端 - 服务器作为一个单元运行)。

回到我的代码。当我运行它时,它会给我以下输出,这不是我想要的。它应该是同步的,以便客户端和服务器一次处理一个状态。相反,客户端跳过服务器端,并且它没有到达怀俄明州的最后状态。我尝试添加一些同步as per this question

mycodeoutput

我已经在pastebin上链接了完整的代码

FixedMessageSequenceClient

FixedMessageSequenceServer

FixedMessageSequenceProtocol

在代码中,我使用整数的简单文本日志文件:

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是一个瓶颈。

有关如何调试或计算出来的任何提示都表示赞赏,谢谢

1 个答案:

答案 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