繁体   English   中英

如何以正确的顺序输出自动的Client-Server Java网络代码?

[英]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并使用该功能以单个单元运行客户端服务器)。

回到我的代码。 当我运行它时,它会给我以下输出,这不是我想要的。 它应该是同步的,以便客户端和服务器一次处于一种状态。 相反,客户端正在跳到服务器端,并且没有达到怀俄明州的最后状态。 我试图根据这个问题添加一些同步。

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 

所以我的直觉是,我自动发送的查询到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM