JAVA使用多播套接字实现群聊室(局域网)

import java.awt.Dimension;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Multicast extends JFrame implements Runnable {

	private static TextArea mShowMsg; // 显示信息记录
	private TextField mMsgField; // 输入发送内容组件
	private JButton mSendButton; // 发送按钮
	private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

	protected static final int PORT = 3838; // 端口
	private static final String BROADCAST_IP = "230.0.0.1";
	// IP协议为多点广播提供了一些特殊的IP地址,在224.0.0.0到239.255.255之间
	private static MulticastSocket multicast; // 多播套接字
	private static InetAddress group;
	private static boolean isFirst; // 是否信息记录里的第一条信息

	public Multicast() {
		setTitle("多播群聊室");
		setSize(450, 400);
		int width = (int) screenSize.getWidth();
		int height = (int) screenSize.getHeight();
		setLocation(width / 2 - getWidth() / 2, height / 2 - getHeight() / 2);
		setLayout(null);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				try {
					sendMessage("我下线了!");
				} catch (IOException e) {
					e.printStackTrace();
				}
				System.exit(0);
			}
		});

		mShowMsg = new TextArea();
		mShowMsg.setBounds(20, 10, 400, 280);
		mShowMsg.setEditable(false);
		add(mShowMsg);
		mMsgField = new TextField();
		mMsgField.setBounds(20, 310, 320, 28);
		add(mMsgField);
		mSendButton = new JButton("发送");
		mSendButton.setBounds(350, 310, 70, 28);
		mSendButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 发送数据
				try {
					sendMessage(mMsgField.getText());
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});

		add(mSendButton);
		setVisible(true);
	}

	public static void main(String[] args) throws IOException {
		isFirst = false;
		multicast = new MulticastSocket(PORT);
		group = InetAddress.getByName(BROADCAST_IP); // 多播组
		multicast.joinGroup(group); // 加入该多播组,才能接收到数据包
		new Thread(new Multicast()).start();
		try {
			Thread.sleep(100); // 等信息接收者做好准备,在发送“我上线了!”的信息,保证能接收到
			sendMessage("我上线了!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 广播此条信息
	 * 
	 * @throws IOException
	 */
	private static void sendMessage(String msg) throws IOException {
		// 被发送的数据包类
		DatagramPacket packet = new DatagramPacket(msg.getBytes(),
				msg.getBytes().length, group, PORT);
		multicast.send(packet); // 发送数据包

	}

	@Override
	public void run() {
		// 接收信息
		byte[] msg = new byte[1024];
		while (true) {
			DatagramPacket packet = new DatagramPacket(msg, msg.length);
			try {
				multicast.receive(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (isFirst) {
				mShowMsg.append("\r\n");
			}
			System.out.println(new String(msg, 0, packet.getLength()));
			isFirst = true;
			mShowMsg.append(packet.getAddress() + " 说: "
					+ new String(msg, 0, packet.getLength()).trim());
		}

	}
}


运行效果:





猜你喜欢

转载自blog.csdn.net/u012964281/article/details/42782145