UDP中使用的DatagramPacket
Posted
技术标签:
【中文标题】UDP中使用的DatagramPacket【英文标题】:DatagramPacket Using in UDP 【发布时间】:2020-03-16 10:31:05 【问题描述】:我正在尝试使用 Java 中的 DatagramPacket 与服务器和客户端进行通信。
我的目标是:当客户端说:“你好”时,服务器应该回复:“嗨,很高兴认识你”。所以我使用 if 条件来实现这一点。
但是,当输入是“Hello”时,它似乎跳过了 if 条件(我已经使用了调试)。我想知道为什么会这样?好像太诡异了。谁能帮我解决这个问题?任何帮助,将不胜感激!谢谢!
代码:
客户:
public static void main(String[] args)
System.out.println("This is Server");
DatagramSocket server = null;
byte[] container = new byte[1024];
try
server = new DatagramSocket(9998);
catch (SocketException e)
e.printStackTrace();
DatagramPacket dPacket = new DatagramPacket(container, container.length);
try
while(true)
server.receive(dPacket);
byte[] datas = dPacket.getData();
String temp = new String(datas);
if (temp.equals("Hello"))
System.out.println("Hi~!Nice to meet you!");
else if (temp.equals("How are you?"))
System.out.println("I am good!");
else
System.out.println("Have a good day");
if (temp.equals("exit"))
break;
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
server.close();
客户:
public static void main(String[] args)
// TODO Auto-generated method stub
System.out.println("This is Client");
try
DatagramSocket client = new DatagramSocket(8888);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = "";
while(!input.equals("exit"))
input = br.readLine();
byte[] msg = input.getBytes();
DatagramPacket dPacket = new DatagramPacket(msg, msg.length,new InetSocketAddress("localhost",9998));
client.send(dPacket);
client.close();
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
【问题讨论】:
【参考方案1】:接收数据时尝试以下操作。
byte[] datas = dPacket.getData();
String temp = new String(datas, 0, dPacket.getLength());
【讨论】:
谢谢shazin,它工作。你能解释一下为什么会这样吗?我有点困惑。 当DatagramPacket
除了来自客户端/服务器的消息之外,它还可能包含来自低级别网络缓冲区的垃圾值。这些值将与消息一起在数据字节数组中。但是DatagramPacket.getLength()
将具有原始消息的长度,没有垃圾值。因此,当我们使用String
的偏移量和基于长度的构造函数时,您可以从字节数组中获取准确的消息,而不会产生垃圾。以上是关于UDP中使用的DatagramPacket的主要内容,如果未能解决你的问题,请参考以下文章