基于IP多播的网络会议程序

基本原理

多播可以理解为一个人向多个人(但不是在场的所有人)说话,这样能够提高通话的效率。如果要通知特定的某些人同一件事情,但又不想让其他人知道,使用电话一个一个地通知就非常麻烦,而日常生活的大喇叭进行广播通知,就达不到只通知个别人的目的了。

多播也可以称为组播,采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。

代码:

package MulticastChat;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MulticastChatApplication {
    private JFrame sendFrame;
    private JFrame receiveFrame;
    private JTextArea sendTextArea;
    private JTextArea receiveTextArea;
    private JTextField messageTextField;
    private JButton sendButton;

    private MulticastSocket multicastSocket;
    private InetAddress group;
    private static final String MCAST_ADDR = "233.0.0.1";
    private static final int MCAST_PORT = 5150;

    public MulticastChatApplication() {
        createSendWindow();
        createReceiveWindow();

        try {
            group = InetAddress.getByName(MCAST_ADDR);
            multicastSocket = new MulticastSocket(MCAST_PORT);
            multicastSocket.joinGroup(group);
            receiveMessages();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void createSendWindow() {
        sendFrame = new JFrame("发送信息窗口");
        sendTextArea = new JTextArea(10, 30);
        sendTextArea.setEditable(false);
        JScrollPane sendScrollPane = new JScrollPane(sendTextArea);
        sendFrame.add(sendScrollPane, BorderLayout.CENTER);

        messageTextField = new JTextField(20);
        sendButton = new JButton("Send");
        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String message = messageTextField.getText();
                sendMessage(message);
                messageTextField.setText("");
            }
        });

        JPanel messagePanel = new JPanel();
        messagePanel.add(messageTextField);
        messagePanel.add(sendButton);
        sendFrame.add(messagePanel, BorderLayout.SOUTH);

        sendFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sendFrame.setSize(400, 300);
        sendFrame.setVisible(true);
    }

    private void createReceiveWindow() {
        receiveFrame = new JFrame("接收信息窗口");
        receiveTextArea = new JTextArea(10, 30);
        receiveTextArea.setEditable(false);
        JScrollPane receiveScrollPane = new JScrollPane(receiveTextArea);
        receiveFrame.add(receiveScrollPane, BorderLayout.CENTER);

        receiveFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        receiveFrame.setSize(400, 300);
        receiveFrame.setVisible(true);
    }

    private void receiveMessages() {
        Thread receiveThread = new Thread(() -> {
            byte[] buf = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            while (true) {
                try {
                    multicastSocket.receive(packet);
                    String receivedMessage = new String(packet.getData(), 0, packet.getLength());
                    if (receivedMessage.equals("QUIT")) {
                        break;
                    }
                    receiveTextArea.append("RECV: '" + receivedMessage + "' FROM <" + packet.getAddress().getHostAddress() + ">\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            multicastSocket.close();
        });
        receiveThread.start();
    }

    private void sendMessage(String message) {
        byte[] buf = message.getBytes();
        DatagramPacket packet = new DatagramPacket(buf, buf.length, group, MCAST_PORT);
        try {
            multicastSocket.send(packet);
            if (message.equals("QUIT")) {
                multicastSocket.leaveGroup(group);
                multicastSocket.close();
                System.exit(0);
            } else {
                sendTextArea.append("SEND: '" + message + "'\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(MulticastChatApplication::new);
    }
}


运行结果:

 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值