JAVA实现UDP组播聊天程序

分类: Java

一、实验环境

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

开发工具:eclipce3.2

测试环境:局域网

二、实验目的

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

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

/**

* 该程序实现了简单组播聊天功能;

* 步骤:

* 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”文件中;

* 作者:蓝蔡

*/

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

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

}

}

JAVA实现UDP组播聊天程序,布布扣,bubuko.com

时间: 2024-10-03 13:13:30

JAVA实现UDP组播聊天程序的相关文章

Java UDP 多用户 组播 聊天程序

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

Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select poll epoll udp组播 线程池

[本文谢绝转载原文来自http://990487026.blog.51cto.com] Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select  poll  epoll udp组播 线程池 TCP 11种状态理解: 1,客户端正常发起关闭请求 2,客户端与服务端同时发起关闭请求 3,FIN_WAIT1直接转变TIME_WAIT 4,客户端接收来自服务器的关闭连接请求 多路IO转接服务器: select模型 poll模型 epoll模型 udp组播模型 线

Android对UDP组播接收数据的有限支持(一)

最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 1 package com.hsocket.Udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 7 public class UdpReceiv

UDP 组播/多播实现步骤

UDP组播 实现服务器对客户端分组播放(发送数据). 实现步骤: server.c 1.创建服务器套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);   返回套接字 2.构建服务器地址结构 struct sockaddr_in serveraddr; #include <strings.h> bzero(&server

C# 使用UDP组播实现局域网桌面共享

最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类的内容,不含视频. 1)抓屏 参考了网上找到的一段代码如下 static BitmapSource CopyScreen() { using (var screenBmp = new Bitmap((int)SystemParameters.PrimaryScreenWidth, (int)Syst

(转)C# 使用UDP组播实现局域网桌面共享

转:http://www.cnblogs.com/mobwiz/p/3715743.html 最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类的内容,不含视频. 1)抓屏 参考了网上找到的一段代码如下 static BitmapSource CopyScreen() { using (var screenBmp = new Bitmap((int

UDP组播相关

Windows服务端 #include "stdafx.h" #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <stdlib.h> #define MCASTADDR "239.255.255.239" //本例使用的多播组地址. #define MCASTPORT 9111 //绑定的本地端口号. #define BUFS

QT的UDP组播技术

一 UDP介绍 UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输.适合下面4种情况: 网络数据大多为短消息. 拥有大量客户端. 对数据安全性无特殊要求 网络负担非常重,但对响应速度要求高. 二 基于udp协议的c/s编程模型(广播),组播的话,明天再看. 客户端: class Sender : public QObject { Q_OBJECT //可以使用信号和槽 public: explicit Sender(QObject *parent = 0); ~Sender();

ios UDP组播

这几天在做wifi的智能灯,需要用到组播的知识就把这个记录一下,服务端使用java写的,代码如下: 1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.InetAddress; 5 import java.net.MulticastSocket; 6 7 class UDPServer{ 8 public static