java如何实现群聊_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());

}

}

}

运行效果:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值