java - 为什么扫描仪在 Java 中无法正常工作?
问题描述
所以我正在用java制作一个客户端-服务器程序,专注于更改服务器上的数据。这是客户端的代码:
package com.company;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Client {
public static void main(String[] args){
try {
DatagramSocket socket=new DatagramSocket(4001);
while(true){
Scanner jin=new Scanner(System.in);
String text=jin.nextLine();
byte[] word=new byte[256];
int command=Integer.parseInt(text);
word=text.getBytes();
DatagramPacket packet=new DatagramPacket(word, word.length, InetAddress.getByName("localhost"), 4000);
socket.send(packet);
if (command==0){
word=new byte[256];
packet=new DatagramPacket(word, word.length);
socket.receive(packet);
word=packet.getData();
System.out.println(new String(word));
}
else if (command==1){
word=new byte[256];
packet=new DatagramPacket(word, word.length);
socket.receive(packet);
System.out.println(new String(word));
int broj=jin.nextInt();
word=Integer.toString(broj).getBytes();
packet=new DatagramPacket(word, word.length, InetAddress.getByName("localhost"), 4000);
socket.send(packet);
word=new byte[256];
packet=new DatagramPacket(word, word.length);
socket.receive(packet);
System.out.println(new String(word));
new ClientHandler(socket).start();
}
else if(command==2){
word=new byte[256];
packet=new DatagramPacket(word, word.length);
socket.receive(packet);
System.out.println(new String(word));
jin=new Scanner(System.in);
int broj=Integer.parseInt(jin.next());
System.out.println("Test");
byte[] word1=Integer.toString(broj).getBytes();
System.out.println(new String(word1));
packet=new DatagramPacket(word1, word1.length, InetAddress.getByName("localhost"), 4000);
socket.send(packet);
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
问题在于 if 语句,其中:
else if (command==2)
在我输入一个有效数字后,程序不会继续前进。经过一些调试后,我发现问题出在扫描仪上,或者:
int broj=Integer.parseInt(jin.next());
扫描仪没有注册输入的值,也没有打印“test”,程序卡住了。有人知道解决方案吗?
解决方案
您不止一次制作 Scanner;这不好。拥有一台扫描仪(在 while 循环之外创建)。
不要混合
nextLine
和任何其他下一个方法。要么只使用 nextLine,要么从不使用 nextLine。如果你想抓取'下一个字符串,直到换行'(而不是'下一个字符串直到一个空格,这next()
通常是这样做的),设置分隔符:scanner.useDelimiter("\r?\n")
在扫描仪之后立即意味着现在next()
将抓取整行。
注意:您通常会看到关于在nextLine
非下一次通话后额外投入的建议。这是非常常见的,但不好的建议。如上所述,修复分隔符。
推荐阅读
- python - 如何将 match.group() 文本放入熊猫数据框中?
- boost - 使用内存清理程序与静态库链接时提升未定义符号问题
- angular - 将 Angular 应用程序更新到最新版本 10.0 后的 aws-amplify 警告
- cakephp - I have to contain two models with json field value in cakphp
- javascript - 创建具有乘法功能的片段
- c# - 如何使用互操作在excel中复制粘贴合并的单元格
- spring-boot - 使用rabbitmq消息时获取方法未找到异常
- mysql - MySQL 数据类型重新插入值
- c# - 类型或命名空间定义,或编译时预期的文件结尾问题
- javascript - Css:如何用边界线连接两个点