【问题标题】:Multicast group clients doesn't receive the message from server多播组客户端没有收到来自服务器的消息
【发布时间】:2018-01-04 01:40:11
【问题描述】:

我创建了一个聊天应用程序,用于向与多个客户端的多播组对话发送消息。

消息必须发送到MulticastServer 并发送到组播组中的所有客户端。至此,消息完美地从客户端到达服务器。

但是当我回复客户端(甚至是简单的字符串)时,消息仅发送给发送消息的客户端,而不是发送给多播组中的所有用户。

StackTrace 没有给我任何错误,但我仍然遇到这个问题。

我给你一些重要的代码。以下是与多播服务器的连接。 DEFAULT_ADRESS 是 224.0.0.3。

    socket = new MulticastSocket();
    address = InetAddress.getByName(DEFAULT_ADRESS);
    socket.joinGroup(address);

向 MulticastServer 发送消息的部分代码:

String messtoSendServer = utilizadorOnline.getNome() + ":" + textfieldtocomunicateGroupe.getText();

        buf = messtoSendServer.getBytes();

        packet = new DatagramPacket(buf, buf.length, address, DEFAULT_PORT);

        try {
            // userOnline_Multicast.getSocketMulti().send(packet);
            socket.send(packet);

        } catch (IOException ex) {
            Logger.getLogger(ConversaGrupo.class.getName()).log(Level.SEVERE, null, ex);
        }

从服务器接收消息的部分代码:

  private void receberDadosServidor() throws IOException {



            try {

                DatagramPacket packet1 = new DatagramPacket(buf, buf.length);

                socket.receive(packet1);

                String received = new String(packet1.getData());

                textareatoGroupChat.setText(textareatoGroupChat.getText() + "\n" + received);

            } catch (IOException ex) {

                Logger.getLogger(ConversaGrupo.class.getName()).log(Level.SEVERE, null, ex);
                socket.close();
                socket.leaveGroup(address);
            }

这是服务器端。首先启动线程:

 public void run(JTextArea txtArea) throws IOException {


       new MulticastServerThread(txtArea).start();
    }

还有线程本身:

public class MulticastServerThread extends Thread {

    private final String DEFAULT_MULTICASTIP = "224.0.0.3";
    private final int DEFAULT_MULTICASTPORT = 4446;
    private final int FIVE_SECONDS =5000;
    private DatagramPacket packet;
    private JTextArea textA;
    private boolean moreQuotes = true;
    private MulticastSocket socket = null;

    private InetAddress adresstoConnectMulticast = null;

    public MulticastServerThread(JTextArea txt) throws IOException {
        super("MulticastServerThread");
        this.textA = txt;

    }

    @Override
    public void run() {

        while (true) {
            try {
                byte[] buf = new byte[1024];

                socket = new MulticastSocket(DEFAULT_MULTICASTPORT);
                adresstoConnectMulticast = InetAddress.getByName(DEFAULT_MULTICASTIP);

                socket.joinGroup(adresstoConnectMulticast);

                packet = new DatagramPacket(buf, buf.length, adresstoConnectMulticast, DEFAULT_MULTICASTPORT); //usado para receber um datagram do socket, o array de bytes contem dados do cliente especifico

                socket.receive(packet);

                String mensagem = new String(packet.getData()).trim();

                textA.setText(textA.getText() + "\n\nServer Multicast Receive from User:" + mensagem +" on IP Multicast " +DEFAULT_MULTICASTIP +" | "+ DEFAULT_MULTICASTPORT);

                buf = mensagem.getBytes();
                InetAddress ed = packet.getAddress();
                int portad = packet.getPort();

//manda de volta para o cliente.
                packet = new DatagramPacket(buf, buf.length, ed, portad);
                socket.send(packet);

                try {

                    sleep((long) Math.random() * FIVE_SECONDS);
                } catch (InterruptedException e) {
                }

            } catch (IOException ex) {
                Logger.getLogger(MulticastServerThread.class.getName()).log(Level.SEVERE, null, ex);
                socket.close();

            }

        }
    }
}

【问题讨论】:

    标签: java udp multicast


    【解决方案1】:

    这里有几个问题。

    socket = new MulticastSocket();
    

    您的客户端都需要绑定到同一个端口。为构造函数提供一个固定的端口号。否则你会得到一个系统分配的端口。

    其次,您的服务器回复源的 IP 地址和端口号。应该回复组IP地址和源的端口号,或者上面的固定端口号,应该是一样的。

    第三,保留224.0.0.3。你不能使用它。

    并让服务器的套接字保持打开状态。不要每次在循环中打开和关闭它。

    【讨论】:

    • 感谢 EJP,我遇到了另一个问题。客户端等待服务器响应的最佳方式是什么?我的程序目前需要在每个客户端多次按下按钮才能看到特定客户端发送的消息。
    • 现在可以了,我在接收方法中添加了一个while循环!
    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多