如何以正确的顺序输出自动的Client-Server Java网络代码?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何以正确的顺序输出自动的Client-Server Java网络代码?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3493字,纯文字阅读大概需要5分钟。
内容图文
![如何以正确的顺序输出自动的Client-Server Java网络代码?](/upload/InfoBanner/zyjiaocheng/693/a4467f5f05754b78a05a8f68100c502c.jpg)
首先让我说我知道这是很多代码,所以请耐心等待.我正在做一个项目,正在将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
在代码中,我正在使用一个简单的整数整数文本日志文件:
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类的方式)的速度可能太快了,也许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 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 */
内容总结
以上是互联网集市为您收集整理的如何以正确的顺序输出自动的Client-Server Java网络代码?全部内容,希望文章能够帮你解决如何以正确的顺序输出自动的Client-Server Java网络代码?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。