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());
		}

	}
}

运行效果:

时间: 2024-10-05 04:45:04

JAVA使用多播套接字实现群聊室(局域网)的相关文章

67.JAVA编程思想——套接字

67.JAVA编程思想--套接字 "套接字"或者"插座"(Socket)也是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条虚拟的"线缆".线缆的每一端都插入一个"套接字"或者"插座"里.当然,机器之间的物理性硬件以及电缆连接都是完全未知的.抽象的基本宗旨是让我们尽可能不必知道那些细节.

Java如何使套接字向单个客户端显示消息?

在Java编程中,如何使用套接字向单个客户端显示消息? 以下示例演示了如何使用Socket类的ssock.accept()方法向单个套接字客户端上显示消息. package com.yiibai; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class SocketSingleClient { public static void main(String args

使用java做一个能赚钱的微信群聊机器人(2020年基于PC端协议最新可用版)

前言 微信群机器人,主要用来管理群聊,提供类似天气查询.点歌.机器人聊天等用途. 由于微信将web端的协议封杀后,很多基于http协议的群聊机器人都失效了,所以这里使用基于PC端协议的插件来实现. 声明以下过程只用于交流学习,并不用于任何商业用途,这里记录一下整体的开发流程. 效果展示 接入过程 准备材料 下文中的服务器可以只需要一台,或者使用你本地电脑,我介绍一下我的环境. 可爱猫微信机器人插件V4.4.0. 一台windows服务器. 一台linux服务器. nginx安装(在window服

java 网络编程-套接字Socket图

原文地址:https://blog.51cto.com/14437184/2432469

LINUX TCP套接字详细配置

提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式,来提高单位时间内的并发量.但是即使这么做了,当网站发展起来之后,连接数过多 的问题就会日益明显.在节省成本的情况下,可以考虑修改Linux的内核TCP/IP参数,来最大的压榨服务器的性能.当然,如果通过修改内核参数也无法 解决的负载问题,也只能考虑升级服务器了,这是硬件所限,没有办法的事. Lin

java_socket套接字网络编程_实现多线程聊天

java编程_socket_套接字_网络编程_简易的GUI多线程聊天程序 运行效果: =============================================================== 服务器端代码: 1 package com.b510.socket1706.gui.freeechatroom; 2 3 import java.io.*; 4 import java.net.*; 5 import java.awt.*; 6 import java.awt.even

Java套接字编程实现群聊与私聊[原理版]

简介 运用Java套接字我们几乎可以完成一个网络聊天软件的小产品,本文不涉及UI部分,仅对原理部分用代码演示一下.一个可以多人聊天的小功能,在Linux系统上用telnet亲测可用. 服务器代码 package demo0811.demo3; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.

Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

java.sql.SQLException: 无法从套接字读取更多的数据(mybatis 插入时)

今天  做mybatis 的批量插入的时候  出现 java.sql.SQLException: 无法从套接字读取更多的数据   的错误 解决方法: 由于批量插入的数据过大,需要分批次的插入. List<IdentificationData> insertList = new ArrayList<IdentificationData>(); for (IdentificationData domain : list) { insertList.add(domain); //批量插入