java - Java中UDP数据报仅显示第一个字符

标签 java udp datagram

我正在尝试制作一个 Echo 服务器-客户端 UDP 应用程序。客户端应该发送超过 20 个号码,服务器只会将它们发回。但是,据我所知,它仅显示正在发送 String 中的第一个字符。我向我的教授寻求帮助,但他也无法弄清楚。一些帮助会很好。谢谢!

客户端.java:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class client {
    public static void main(String[] args) {
        DatagramSocket socket;
        try {
            socket = new DatagramSocket();
            InetAddress address = InetAddress.getByName("localhost");
            byte[] buf = new byte[256];
            for (Integer i = 1; i < 21; i++) {
                buf = i.toString().getBytes();
                DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
                socket.send(packet);
                packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
                String received = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Server: " + received);
            }
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

服务器.java:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class server {
    public static void main(String argsp[]) {
        DatagramSocket socket;
        try {
            socket = new DatagramSocket(4445);
            byte[] buf = new byte[256];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            while (true) {
                socket.receive(packet);
                String message = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Client: " + message);
                buf = message.getBytes();
                InetAddress address = packet.getAddress();
                int port = packet.getPort();
                packet = new DatagramPacket(buf, buf.length, address, port);
                socket.send(packet);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端输出:

Server: 1
Server: 2
Server: 3
Server: 4
Server: 5
Server: 6
Server: 7
Server: 8
Server: 9
Server: 1
Server: 1
Server: 1
Server: 1
Server: 1
Server: 1
Server: 1
Server: 1
Server: 1
Server: 1
Server: 2

服务器输出:

Client: 1
Client: 2
Client: 3
Client: 4
Client: 5
Client: 6
Client: 7
Client: 8
Client: 9
Client: 1
Client: 1
Client: 1
Client: 1
Client: 1
Client: 1
Client: 1
Client: 1
Client: 1
Client: 1
Client: 2

最佳答案

每次收到数据报时,DatagramPacket 都会缩小到指定长度。因此,在您的服务器中,第一次接收后它会缩小到 1。您需要在接收 lopo 内重新创建它,或者至少在循环顶部重置其长度。

关于java - Java中UDP数据报仅显示第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42881457/

相关文章:

java - 我在使用此代码将 csv 转换为 json 架构时收到此错误

java - 如何删除 Java 7 上打印对话框中的 Java 图标

java - 如何创建控制电脑鼠标的android应用程序

c# - 使用相同的套接字进行 UDP 发送和接收有优点还是缺点?使用 C 和 C#

写入数据报套接字是否可以引发 SIGPIPE?

java - 关于字段的私有(private)静态最终关键字的快速 Java 问题

java - RejectedExecutionHandler - CallerRunsPolicy 与 AbortPolicy

networking - scapy sr1 ICMP 响应

c - UDP 客户端不会自动重新连接

qt4 - 使用 QUdpSocket 发送数据报