今天为大家带来了一个非常有意思的小程序——UDP实现的群聊聊天室。这个程序使用的UDP协议,并使用DatagramSocket的子类MulticastSocket实现组播,可以部署在一个局域网内的多台电脑上,并可以实现文字群聊。
按照以下几个小节讲解:
1). 组播的概念:这个小节我们将讲解什么是:单播、广播、组播。
2). MulticastSocket类的使用:这个小节我们将讲解MulticastSocket类的基本使用,并实现控制台的信息收发。
3). 基于Swing和MulticastSocket实现的UDP群聊聊天室:**这个小节我们将制作一个界面,并结合MulticastSocket类实现一个完整的UDP群聊聊天室。
4). 结束语:
一、组播的概念
网络数据传播按照接收者的数量,可分为以下3种方式:
1.1 单播:
单播是指实现“点对点”的通信,发送者发送数据要发送给网络上的唯一的一台电脑,指定一个接收者。像TCP协议和UDP协议都能实现点对点通信。
1.2 广播:
发送者发送的数据可以被某个接收范围内所有的接收者接收。它类似于广播电台,向某个范围内的所有用户发送广播信号,接收人打开广播就可以听到,关闭广播设备就停止收听。由于广播会大大增加网络数据流量,所以通常情况下一些网络路由器会禁止广播数据,尤其是一些占用网络资源比较大的视频数据等。
1.3 组播:
组播是指发送的数据可以被指定的一组用户接收。组播的范围没有广播那么广,任何的一台电脑都可以随时加入某一个组接收组播数据。若要使用组播,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有主机都能收到该数据报。IP协议为组播提供了这批特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255。在Java类库中,DatagramSocket有一个子类:MulticastSocket,它具有组播的功能,它可以与DatagramPackage结合使用,用于发送和接收组播包。
二. MulticastSocket类的使用
Java类库中MulticastSocket类可以实现组播功能,它是DatagramSocket的子类:
2.1 构造方法说明
通过API文档我们可以看到它有三个构造方法:
1. MulticastSocket() 创建一个多播套接字。(使用随机端口,如果只发送,可以使用这个构造方法)
2. MulticastSocket(int port) 创建一个多播套接字并将其绑定到一个特定的端口。(如果需要发送和接收,需要使用这个构造方法)
3. MulticastSocket(SocketAddress bindaddr) 创建一个多播套接字绑定到指定的套接字地址。
2.2 成员方法说明
以下是几个比较重要的成员方法:
1.public void joinGroup(InetAddress mcastaddr):将该MulticastSocket加入指定的多点广播地址。
2.public void leaveGroup(InetAddress mcastaddr让该MulticastSocket离开指定的多点广播地址。
3.public void setInterface(InetAddress inf):如果当前系统有多个网络接口,可以使用次方法指定一个网络接口。
4.public InetAddress getInterface():获取当前的网络接口。
5.public void setTimeToLive(int ttl):该参数设置数据报最多可以跨过多少个网络,当ttl为0时,指定数据报应停留在本地主机;当ttl的值为1时,指定数据报发送到本地局域网;当ttl的值为32时,意味着只能发送到本站点的网络上;当ttl为64时,意味着数据报应保留在本地区;当ttl的值为128时,意味着数据报应保留在本大洲;当ttl为255时,意味着数据报可发送到所有地方;默认情况下,该ttl的值为1。
2.3 一个简单的示例
接下来我们写一个小例子来看一下MulticastSocket的使用方式。这个程序将包含两个线程:1. 接收线程,主要用于接收信息;2. 主线程,主要用于发送信息。将这个程序部署到局域网上的几台电脑上,全部启动,就可以实现多台电脑的组播了,而且每台主机都可以发出信息,其它主机则会收到这条信息。
package com.heima.se.chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Date;
import java.util.Scanner;
public class MulticastSocketDemo {
public static void main(String[] args) throws IOException {
//创建MuticastSocket对象,并监听端口55555
MulticastSocket socket = new MulticastSocket(55555);
//加入组:235.235.235.235
socket.joinGroup(InetAddress.getByName("235.235.235.235"));
//启动线程-此线程用于接收数据报
new Thread(()->{
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
while (true) {
try {
socket.receive(packet);
System.out.println(new String(packet.getData(), 0, packet.getLength()