Java字符串等于不适用于UDP服务器收到的数据包

标签 java udp

以下是简单的 UDP 客户端-服务器类:

UDP服务器:

import java.net.*;
/**
 * Source:https://systembash.com/a-simple-java-udp-server-and-udp-client/
 * 
 */
class UDPServer {    
    public static void main(String args[]) throws Exception {            
        DatagramSocket serverSocket = new DatagramSocket(9876);            
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];            
        while (true) {            
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

            serverSocket.receive(receivePacket);                
            String sentence = new String(receivePacket.getData());                 

            // Sentence here is not equal "PING" ?
            if(sentence.equals("PING")) {                       
                System.out.println("It is PING: " + sentence);          
            } else {
                System.out.println(sentence.getClass());
                System.out.println("It is not equal PING. It is <" + sentence + ">");
            }                          
            System.out.println("RECEIVED: " + sentence);

            InetAddress IPAddress = receivePacket.getAddress();                
            int port = receivePacket.getPort();                
            String capitalizedSentence = "PONG"; 
            sendData = capitalizedSentence.getBytes();
            DatagramPacket sendPacket
                    = new DatagramPacket(sendData, sendData.length, IPAddress, port);
            serverSocket.send(sendPacket);
        }
    }
}

UDP客户端:

import java.net.*;
/**
 * Source:
 * https://systembash.com/a-simple-java-udp-server-and-udp-client/
 *
 * @author  
 */
class UDPClient {
    public static void main(String args[]) throws Exception {       
        DatagramSocket clientSocket = new DatagramSocket();        
        InetAddress IPAddress = InetAddress.getByName("localhost");        
        byte[] sendData = new byte[1024];
        byte[] receiveData = new byte[1024];

        String sentence =  "PING";
        sendData = sentence.getBytes();

        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
        clientSocket.send(sendPacket);        
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);        
        String modifiedSentence = new String(receivePacket.getData());
        System.out.println("FROM SERVER:" + modifiedSentence);        
        clientSocket.close();
    }
}

在 UDPServer 中,检查响应(变量语句)。由于某种原因,equals 在必须检测到“PING”时没有检测到。而且它输出的句子字符串是“PING”,类字符串。 这是为什么 ?

UDPServer 的输出是 else:

class java.lang.String
It is not equal PING. It is:<PING>
RECEIVED: PING

如果重要的话,java 版本是“1.7.0_91”。

最佳答案

getData() 为您提供一个缓冲区,您可以从中获取数据。

不要使用trim(),因为这可能会删除您真正想要保留的字符(除了昂贵之外)

相反,您应该使用消息的长度

String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 

这样,您将只提取所需数据的缓冲区部分。

关于Java字符串等于不适用于UDP服务器收到的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104935/

相关文章:

java - 如何从cq5中的子页面获取数据?

java - 如何继承循环泛型?

java - 如何在android中使用UDP套接字?

linux - 如何通过UDP管理多个客户端和值类服务器之间的中间桥接服务器的 session ?

c++ QT QUdp 套接字不发送/接收数据?

java - 如何为 TCP 流编码数据?

java - AWS Tomcat 服务器内存过高

java - 让 TextView 和 EditText 在选择单选按钮时出现?

sockets - 如何获得空闲的套接字端口? C++

客户端使用C使用TCP套接字将数据发送到端口