0

我正在制作一个非常简单的多播应用程序,其中控制器通过简单的消息锁定和解锁电台。控制器和工作站都有接收线程。出于某种原因,发送第一条消息时,接收良好,但发送第二条消息时,接收不正确,其中附加了一些第一条消息。

例如,

Station 1 sends a "Locked: 1001" message.
The controller receives this message correctly.
The controller sends a "Unlock: 1001" message.
Station 1 receives something like "Unlock: 1ocked: 1001"

这是电台的接收器:

public class VotingStationReceiver implements Runnable{
    private DummyVotingStation votingStation;
    private MulticastSocket s;
    private Thread listener = new Thread(this);

    public VotingStationReceiver(MulticastSocket s, DummyVotingStation votingStation){
        this.s = s;
        this.votingStation = votingStation;

        listener.start();
    }

    public void run() {
        byte[] buf = new byte[1024]; 
        while(true) 
            try { 
                DatagramPacket pack = new DatagramPacket(buf, buf.length);
                s.receive(pack);
                String msg = "";
                msg = new String(pack.getData());
                msg = msg.trim();

                System.out.println(msg);
                System.out.println("Voting Station: message received");

                votingStation.processMessage(msg);

            } catch(IOException e) { 
                    break; 
            } 
    }

}

这是发送控制器消息的地方:

    private String unlockMsg = "Unlock: ";
    public void unlockStation(int lockedID) {
        //send packet telling station to unlock
        String completeMsg = unlockMsg+lockedID;
        byte buf[] = completeMsg.getBytes(); 
        // Create and send the DatagramPacket
        DatagramPacket pack;
        try {
            pack = new DatagramPacket(buf, buf.length,
                    InetAddress.getByName(group), port);
            int ttl = s.getTimeToLive();
            s.setTimeToLive(ttl);
            s.send(pack);
            System.out.println("Control Station: message sent");
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我知道这可能是初学者的问题,但我一般对多播和网络没有太多经验。

4

2 回答 2

1

问题是您没有注意收到的数据包的长度。改变

    msg = new String(pack.getData());

    msg = new String(pack.getData(), 0, pack.getLength());

第一次在代码中创建字符串时,它(有点)起作用了....因为您随后trim()将字符串去掉了尾随的 NUL(零)字符。

第二次,您正在读取脏缓冲区,因此垃圾被解码为非 NUL 字符。

FWIW,如果您在创建字符串时使用数据包长度,则不再需要trim()删除尾随的 NUL 字符。

于 2014-04-14T11:36:51.943 回答
0

我怀疑您的问题是您正在将 a 接收Datagram到现有缓冲区中,该缓冲区中包含来自先前Datagram收据的数据。尝试byte[]为每个接收使用一个新的。我认为您还需要考虑传入的数据长度,因此请查看此 SO 答案以使用pack.getLength()

于 2014-04-14T11:25:55.087 回答