Java UDP 多用户 组播 聊天程序

一、实验环境

编程语言:Java1.8(运行在JVM(Java Virsual Machine))

开发工具:eclipce

测试环境:局域网

二、实验目的

社会已经进入信息时代,网络技术在飞速发展.大量应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分布的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播.

三、组播聊天程序的实现:

package cn.gdut.edu.udp;

/**
 * 该程序实现了简单组播聊天功能;
 * 步骤:
 * 1、利用java.net包中的MulticastSocket生成对象s;
 * 2、设置组播地址group=InetAddress.getByName("228.9.6.8");
 * 3、加入组播s.joinGroup(group);
 * 4、将要发送的所有信息封装成一个数据报data=DatagramPacket的一个实例;
 * 5、数据报的头部放入聊天人的别名name;
 * 6、发送处理好的数据包:s.send(data);
 * 7、创建一个接受数据报的队列recv:DatagramPacket(buf, buf.length),队列大小为100字节;
 * 8、创建一个监听线程,线程中执行数据包的接受功能:s.receive(recv);
 * 9、聊天记录可以手动保存至”Note.txt”文件中;
 * 作者:chen
 */
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import javax.swing.*;

public class MutilCast {
	public static void main(String[] args) {
		MulticastSocket s = null;
		InetAddress group = null;
		JPanel northPanel = new JPanel();
		JPanel southPanel = new JPanel();
		JPanel namePanel = new JPanel(new FlowLayout());
		JLabel sendLabel = new JLabel("发送内容:");
		JLabel nameChangeLabel = new JLabel("给自己起个名字:");
		final JTextField nameSpace = new JTextField(20);
		final JTextArea messageArea = new JTextArea("", 20, 20);
		final JTextField sendField = new JTextField(30);
		JScrollPane message = new JScrollPane(messageArea);
		JButton sendButton = new JButton("发送");
		JButton saveButton = new JButton("保存记录");
		JButton clearUpButton = new JButton("清空面板");
		Box centerBox = Box.createVerticalBox();
		namePanel.add(nameChangeLabel);
		namePanel.add(nameSpace);
		centerBox.add(namePanel);
		centerBox.add(message);
		// 实现组播数据传送的配置信息
		try {
			group = InetAddress.getByName("228.9.6.8");
		} catch (UnknownHostException e1) {
			System.out.println("组播地址绑定失败");
		}
		try {
			s = new MulticastSocket(6789);
		} catch (IOException e1) {
			System.out.println("组播地址创建失败");
		}
		try {
			s.joinGroup(group);
		} catch (IOException e1) {
			System.out.println("组播地址加入失败");
		}
		// end实现组播数据传送的配置信息
		// “发送”按钮实现信息功能的发送部分
		class SendMsg implements ActionListener {
			String msg = null;
			MulticastSocket s = null;
			InetAddress group = null;

			public SendMsg(MulticastSocket s, InetAddress group) {
				this.s = s;
				this.group = group;
			}

			public void actionPerformed(ActionEvent e) {
				try {
					// 如果名字为空 给出提示信息
					if (nameSpace.getText().isEmpty())
						JOptionPane.showMessageDialog(null, "请一定要取别名!");
					else {
						// 如果名字不为空 则把名字添加到数据报头
						msg = (nameSpace.getText() + "说:" + sendField.getText());
						DatagramPacket data = new DatagramPacket(
								msg.getBytes(), msg.getBytes().length, group,
								6789);
						s.send(data);
					}
				} catch (IOException e1) {
					System.out.println("发送失败");
				}
			}
		}
		// 实现数据报的接受线程
		class recevMsg extends Thread {
			MulticastSocket s = null;

			public recevMsg(MulticastSocket s) {
				this.s = s;
			};

			public void run() {
				byte[] buf = new byte[100];
				DatagramPacket recv = new DatagramPacket(buf, buf.length);
				try {
					while (true) {
						s.receive(recv);
						String str = new String(recv.getData());
						String line = System.getProperty("line.separator");
						messageArea.append(str);
						messageArea.append(line);
					}
				} catch (IOException e1) {
					System.out.println("接受失败");
				}
			}
		}
		// 聊天记录的保存 保存在当前位置下的"Note.txt"文件中
		class SaveMsg implements ActionListener {
			String msg = null;
			String line = System.getProperty("line.separator");

			public void actionPerformed(ActionEvent e) {
				try {
					msg = messageArea.getText();
					FileOutputStream Note = new FileOutputStream("Note.txt");
					messageArea.append("记录已经保存在Note.txt");
					Note.write(msg.getBytes());
					messageArea.append(line);
					Note.close();
				} catch (IOException e1) {
					System.out.println("发送失败");
				}
			}
		}
		// 清除面板上的聊天记录
		class ClearMsg implements ActionListener {
			public void actionPerformed(ActionEvent e) {
				try {
					messageArea.setText("");
				} catch (Exception e1) {
					System.out.println("清空失败");
				}
			}
		}
		JFrame mutilCastFrame = new JFrame("组播聊天工具");
		northPanel.add(sendLabel);
		northPanel.add(sendField);
		northPanel.add(sendButton);
		southPanel.add(saveButton);
		southPanel.add(clearUpButton);
		mutilCastFrame.getContentPane().add(northPanel, "North");
		mutilCastFrame.getContentPane().add(southPanel, "South");
		mutilCastFrame.getContentPane().add(centerBox, "Center");
		mutilCastFrame.setDefaultCloseOperation(mutilCastFrame.EXIT_ON_CLOSE);
		sendButton.addActionListener(new SendMsg(s, group));
		saveButton.addActionListener(new SaveMsg());
		clearUpButton.addActionListener(new ClearMsg());
		mutilCastFrame.setSize(500, 500);
		mutilCastFrame.setLocation(200, 200);
		mutilCastFrame.show();
		recevMsg r = new recevMsg(s);
		r.start();
	}
}

时间: 2024-11-05 12:26:42

Java UDP 多用户 组播 聊天程序的相关文章

JAVA实现UDP组播聊天程序

分类: Java 一.实验环境 编程语言:Java1.5(运行在JVM(Java Virsual Machine)) 开发工具:eclipce3.2 测试环境:局域网 二.实验目的 社会已经进入信息时代,网络技术在飞速发展.大量应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分布的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 三.组播聊天程序的实现: /** * 该程序实现了

UDP及其组播,接收发送封装

1.Receiver 1 public class Receiver 2 { 3 public delegate void HeartBeat(byte[] data); 4 public event HeartBeat Heart; 5 6 #region 内部变量 7 private int size = 65535; 8 private UdpClient newsock; 9 private Thread t; 10 private int m_port; 11 private IPEn

基于Java的hello/hi网络聊天程序

Socket(套接字)是一种独立于具体协议的网络编程接口,在OSI模型中位于会话层和传输层之间.根据其使用方式可将套接字分为主动套接字和被动套接字,被动套接字指的是等待传入连接的套接字(如,服务器套接字),主动套接字指的是发起连接的套接字(如,客户端套接字).以下是一个基于Java的Socket类编写的hello/hi网络程序. Client端代码: import java.net.*; import java.io.*; public class ChatClient { public sta

利用java的Socket实现一个简单hello/hi聊天程序

利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序.在这个程序里,我学习到了怎么用socket套接套接字来进行编程.简单理解了一些关于socket套接字和底层调用的关系.关于java的封装思想,我学会了一些东西,java里真的是万物皆对象.还学到了一点多线程的知识. TCP 在这里,不得不先介绍以下TCP.TCP是传输层面向连接的协议.提供了端到端的进程之间的通信方式.TCP在通信之前要先建立连接.这里我们称这个建立连接的

通过基于java实现的网络聊天程序分析java中网络API和Linux Socket API关系

1. 引言 socket网络编程,可以指定不同的通信协议,在这里,我们使用TCP协议实现基于java的C/S模式下“hello/hi”网络聊天程序 2. 目标 1). 通过该网络聊天程序,了解java Socket API接口的基本用法 2). java Socket API简要介绍 3). linux socket API 简单分析 4). tcp协议的连接和终止 5). 探究java socket API 和 linux socket api之间的关系 3. linux socket API

Android开发:组播(多播)与广播

近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播)背景知识:组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IPv4中组播地址范围为224.0.0.0到239.255.255.255.JAVA编程:java中通过MulticastSoc

使用python实现一个hello/hi的简单的网络聊天程序

一.TCP/IP协议通信原理 TCP/IP协议包含的范围非常的广,它是一种四层协议,包含了各种硬件.软件需求的定义.TCP/IP协议确切的说法应该是TCP/UDP/IP协议.UDP协议(User Datagram Protocol 用户数据报协议),是一种保护消息边界的,不保障可靠数据的传输.TCP协议(Transmission Control Protocol 传输控制协议),是一种流传输的协议.他提供可靠的.有序的.双向的.面向连接的传输. 保护消息边界,就是指传输协议把数据当作一条独立的消

组播原理

原文地址:http://linux.chinaitlab.com/administer/5573.html 摘要: 本文可做为TCP/IP组播技术的入门材料,文中介绍了组播通 信的概念及原理,以及用于组播应用编程的Linux API的详细资料.为了使读者更加完整的了解Linux 组播的整体概念,文中对实现该技术的核心函数也做了介绍.在文章的最后给出了一个简单的C语言套接字编程例子,说明如何创建组播应用程序. 一.导言 在网络中,主机间可以用三种不同的地址进行通信: 单播地址(unicast):即

netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例

网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/21/udp-and-unicast-multicast-broadcast-anycast/#Netty%E4%B8%8E%E5%8D%95%E6%92%AD%EF%BC%8C%E7%BB%84%E6%92%AD netty的Udp单播.组播.广播实例+Java的Udp单播.组播.广播实例, 这些代