一个DatagramPacket类
的大小,这样我正当红的这个代码片段:一个DatagramPacket类
public static void main (String[] args) throws IOException{
DatagramSocket serverSocket = new DatagramSocket(1500);
while(true){
byte[] recieveData = null; //<---look at this #############!!!
DatagramPaket recievePaket = new DatagramPacket (recieveData, recieveData.length);
serverSocket.receive(recievePaket);
String text = recieveData.toString();
if (text.equals("exit")){
serverSocket.close();
System.exit(42);
}else if (text.equals("scan")){
scan();
}
}
}
现在我知道了DatagramPacket的需要缓冲,但它通过如何与“空”初始化?对于我来说,如果不想存储接收到的数据,但是如何才能看到“退出”还是“扫描”被发送? 最重要的是,在没有收到数据包之前,谁能知道缓冲区需要的大小?
以下工作:
public static void main (String[] args) throws IOException {
try (DatagramSocket socket = new DatagramSocket(PORT_NUMBER)) {
boolean loop = true;
final byte[] buffer = new byte[BUFFER_SIZE];
final DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (loop) {
socket.receive(packet);
final String text = new String(packet.getData()).trim();
switch (text) {
case "exit":
loop = false;
break;
case "scan":
scan();
break;
default:
System.err.printf("Received unknown command `%s`%n", text);
}
}
}
}
不幸的是,你必须设置缓冲区的大小。
的变化我做了包括:
- 添加缓冲区大小
- 需要作为你必须创建一个缓冲区来将数据放到
- 添加装饰()删除换行符,以便netcat可以发送命令。
- 需要作为
exit\n
不等于exit
- 需要作为
- 使用交换机来清理命令路由
- 使代码更易于阅读
- 使用条件和尝试资源而不是无限循环
- 避免了问题,并确保该插座总是关闭退出
- 添加决赛做出
- 使它明显的变量不会改变价值
- 重命名一些代码更容易理变量名称,说明他们是什么
- 只是清理,以允许IntelliJ显示真正的问题
- 修复已停止编译
- 在Ubuntu NC测试轻微错别字,所以需要编译
很好的答案!让ma问一些关于你的答案的问题:BUFFER_SIZE可以设置为4个字节,因为我们只希望接收命令“scan”和“exit”?(会自动放弃顶部的换行符)。并且,假设我们希望将其作为一个无限循环来运行并按照希望的频率接收“扫描”,是否仍然可以将变量声明为final(不这么认为,对吧?) –
可以这样做,修剪确实有助于缩短不过像'foo'这样的错误命令,循环可以运行多次,final只是确保变量在范围内不被更改 – jrtapsell
'recieveData.length'是空的领域,你确定代码作品?我试了一下,它没有,在预期的地方给了一个NullPointer – jrtapsell
不,我不确定它的工作原理,问题基本上是如何做到这一点然后 –