关于ZAKER 融媒体解决方案 合作 加入

如何以正确的顺序输出自动的 Client-Server Ja.

CocoaChina 10-21

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

Server: May I have permission to send you a state-capital query?

Client: Ok

Server: Send me a state , so I can send a capital?

Client: Alabama

Server: The capital of Alabama is Hunstville . Want another one ( y/n ) ?

Client: n

进行此项目的动机是稍后演示某种类型的故障保护功能 ( 在我使它起作用之后 , 我想使用 Powershell 并使用该功能以单个单元运行客户端服务器 ) .

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

我已将完整代码链接到 pastebin

FixedMessageSequenceClient

FixedMessageSequenceServer

FixedMessageSequenceProtocol

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

1234

注意:我正在使用 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 类的方式 ) 的速度可能太快了 , 也许 FixedMessageSequenceClient 内部的 IO 成为了瓶颈 .

感谢有关如何调试或解决任何技巧

最佳答案

无需新答案 . 感谢上面的保罗 , 鼓励我自己解决这个问题:

问题是 , 我忽略了 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 lineprivate 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 */

以上内容由"CocoaChina"上传发布 查看原文
相关标签 etc顺序常量

觉得文章不错,微信扫描分享好友

扫码分享