Java UDP 服务器-客户端显示方形字符

标签 java udp client

我使用了在这里找到的 UDP 服务器/客户端示例:http://systembash.com/content/a-simple-java-udp-server-and-udp-client/

客户端向服务器发送一个字符串,服务器将小写字母改为大写。

服务器:

import java.io.*;
import java.net.*;
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());
        System.out.println("RECEIVED: " + sentence);
        InetAddress IPAddress = receivePacket.getAddress();

        int port = receivePacket.getPort();
        String capitalizedSentence = sentence.toUpperCase();
        sendData = capitalizedSentence.getBytes();

        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
        serverSocket.send(sendPacket);
    }
}

}

客户端:

import java.io.*;
import java.net.*;
class UDPClient
{
public static void main(String args[]) throws Exception
{
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in,     "UTF-16"));

    DatagramSocket clientSocket = new DatagramSocket();
    InetAddress IPAddress = InetAddress.getByName("localhost");
    byte[] sendData = new byte[1024];
    byte[] receiveData = new byte[1024];

    String sentence = inFromUser.readLine();
    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();
}
}

我在客户端编写测试时的输出:

test
FROM SERVER:TEST□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□.....

最佳答案

因为您声明了数据包大小:

byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = 
   new DatagramPacket(receiveData, receiveData.length);

以下代码将返回长度为 1024 的字符串:

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

您需要使用 receivePacket.getLength() 来获取有效负载大小,因此将其更改为:

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

应该可以了!

关于Java UDP 服务器-客户端显示方形字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759751/

相关文章:

php - 当php正在处理时如何知道客户端中断请求

java - 如何克服 GUI 调解器中的并发修改异常?

Java 8 : Difference between two LocalDateTime in multiple units

java - 未抛出 SocketTimeoutException

c# - 获取UDP数据包的目的IP地址

java - 如何解决 Oracle 客户端安装问题?

c - c中使用fork()处理socket中多个客户端的逻辑问题

java - 从 GoogleCredentials 获取 applicationDefault

java - 基于 URL 的电影流应用程序,需要帮助将变量字符串从一个类传递到另一个类

c - 时间测量 UDP 套接字 C