java - 通过 UDP 发送对象的多个实例

标签 java object network-programming udp

我是 java 网络编程 的新手。 我尝试通过 UDP 发送名为 Packet 的 object 的多个实例。
发送方:将 String 更改为 charArray,然后在 object 中发送每个字符。
Receiver:接收Datagrampacket,readObject打印出来。
发送方没问题,但接收方只获取对象的第一个实例,并打印与 charArray 长度一样多的次数。这是我的代码:
接收器

public class Receiver {
    public static void main(String args[]) throws Exception 
    { 
        DatagramSocket rcvSocket;
        DatagramPacket rcvPacket;
        ByteArrayInputStream bis;
        ObjectInputStream ois;
        byte[] rcvData;
        Packet SnWPacket;

        rcvSocket = new DatagramSocket(7777);
        rcvData = new byte[1024];
        rcvPacket = new DatagramPacket(rcvData, rcvData.length);

        while(true)
        {
            rcvSocket.receive(rcvPacket);
            byte[] in = rcvPacket.getData();
            bis = new ByteArrayInputStream(in);
            ois = new ObjectInputStream(bis);
            SnWPacket = (Packet) ois.readObject();
            System.out.println("RECIEVED: " + SnWPacket);
            ois.close();
            bis.close();
        }

    }
}

发件人

public class Sender {
    public static void main(String args[]) throws Exception 
    { 

        DatagramPacket sndPacket;
        DatagramSocket sndSocket;
        ByteArrayOutputStream bos;
        ObjectOutputStream oos;
        InetAddress addr;
        Scanner sc;

        char[] charArray;
        int seqNo = 0;
        byte sndData[];
        Packet SnWPacket;

        addr = InetAddress.getByName("localhost");
        sndSocket = new DatagramSocket();
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
        sc = new Scanner(System.in);

        System.out.println("Input: ");
        String in = sc.nextLine();
        charArray = in.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            SnWPacket = new Packet("data", seqNo, charArray[i]);
            oos.writeObject(SnWPacket);
            oos.flush();
            sndData = bos.toByteArray();
            bos.flush();
            sndPacket = new DatagramPacket(sndData, sndData.length, addr, 7777);
            sndSocket.send(sndPacket);
            System.out.println("SENT: " + SnWPacket);
            seqNo += 1;
        }
        oos.close();
        bos.close();
        sndSocket.close();
    } 
}

数据包

public class Packet implements Serializable{
    private String type;
    private int seqNo;
    private char data;
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getSeqNo() {
        return seqNo;
    }
    public void setSeqNo(int seqNo) {
        this.seqNo = seqNo;
    }
    public char getData() {
        return data;
    }
    public void setData(char data) {
        this.data = data;
    }
    public Packet(String type, int seqNo, char data)
    {
        this.type = type;
        this.seqNo = seqNo;
        this.data = data;
    }
    public Packet()
    {
        this.type = "";
        this.seqNo = 0;
        this.data = ' ';
    }
    @Override
    public String toString() {
        return "Packet: \tType: " + this.type + "\tseqNo: " + this.seqNo + "\tdata: " + this.data;
    }
}

假设我发送:“abc”
发件人:

SENT: Packet:   Type: data  seqNo: 0    data: a
SENT: Packet:   Type: data  seqNo: 1    data: b
SENT: Packet:   Type: data  seqNo: 2    data: c

接收者:

RECIEVED: Packet:   Type: data  seqNo: 0    data: a
RECIEVED: Packet:   Type: data  seqNo: 0    data: a
RECIEVED: Packet:   Type: data  seqNo: 0    data: a

问题是接收器打印三个“a”。请帮我弄清楚。谢谢!

最佳答案

要调试这类事情,使用 tcpdump 或类似工具来跟踪网络上实际发生的事情会有所帮助:

$ tcpdump -i lo port 7777
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
19:53:20.818460 IP zoo.59305 > zoo.7777: UDP, length 83
19:53:20.822292 IP zoo.59305 > zoo.7777: UDP, length 100
19:53:20.822410 IP zoo.59305 > zoo.7777: UDP, length 117

这告诉您您正在发送您期望的 3 个数据包,但每个数据包比前一个数据包大 17 个字节(而不是所有数据包的大小都相同)。仔细检查您的发送代码可以解释这一点——您使用单个 ObjectOutputStream 来构造数据包,并且您没有在 Packet 对象之间重置它,因此发送的第一个数据包包含第一个 Packet 对象,而第二个包含 TWO 数据包对象(第一个的副本,然后是第二个),第三个包含所有三个。

在接收方,您只解码接收到的数据包中的第一个 Packet 对象并打印它,所以您将第一个对象打印 3 次...

关于java - 通过 UDP 发送对象的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31690061/

相关文章:

java - 您无法在使用 Glide 的回收 View 时启动已销毁 Activity 的加载

javascript - 是否可以在 JavaScript 中功能性地遍历对象?

java - 协助计算并四舍五入至小数点后两位

java - nextLink1.replace ("""), 使 "表现不同

oracle - 比较对象是否相等时为 "PLS-00526: A MAP or ORDER function is required"

java - 如何知道已经建立的连接的状态?

c++ - 将目标地址与 C++ 中的转发表条目匹配

javascript - 是否可以用JavaScript制作实时网络游戏

java - 如何使用复杂查询获取 Ebean 的项目列表

javascript - Array 中的对象,如何解决这个问题?