Java IP多点传送(基于UDP的C/S)

概要:

IP多点传送MulticastSocket类,IP多点传送是针对点对点的传送和广播传送两种方式而言的,它是指在一定的组内对其成员进行的广播,是一种有限的广播。组中的某个成员发出的信息,组中的其他成员都能收到。它是UDPSocket的一个分支。

网组管理协议(InternetGroupManagementProtocol,IGMP)用于管理多点传送组中的成员。支持多点传送的路由可以使用IGMP决定本地的机器是否赞成加入某个组,一个多点传送路由可以决定是否转发一个多点传送报文。

影响多点传送报文的一个重要参数是time-to-live(TTL)。TTL用于描述发送者希望传送的信息能通过多少不同的网络。当报文被路由器转发,报文中的TTL将减1,当TTL为0时,报文将不再向前发送。

| |目录

实现数据报传送的服务器端

package net.xsoftlab.baike;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;

public class MuliticastServer extends Thread {// 继承线程类操作UDP实现数据报传送的服务器端
	protected DatagramSocket socket = null;// 声明数据报Socket对象
	protected BufferedReader in = null;// 用来读文件的一个Reader
	protected boolean moreQuotes = true;// 标志变量,是否继续操作

	public MuliticastServer() throws IOException {// 无参数的构造函数调用有参构造方法
		this("QuoteServerThread");// 调用带参数的构造函数
	}

	public MuliticastServer(String name) throws IOException {
		super(name); // 调用父类的构造函数
		socket = new DatagramSocket(1111);// 在端口4445创建数据报套接字
		try {// 打开文件创建相应的缓冲读对象
			in = new BufferedReader(new FileReader("D:/poem.txt"));
		} catch (FileNotFoundException e) {// 捕获异常
			System.err.println("不能打开文件或文件不存在...");
		}
	}

	@Override
	public void run() { // 线程主体
		while (moreQuotes) {// 根据标识为真循环
			try {
				byte[] buf = new byte[256]; // 创建缓冲区
				DatagramPacket packet = new DatagramPacket(buf, buf.length);// 由缓冲区创建数据报Packet对象
				socket.receive(packet); // 接收数据报
				String data = null;
				if (in == null)// 初始化打开文件失败,则使用日期作为要传送的字符串
					data = new Date().toString();
				else
					data = getFileInfo();// 调用方法从文件中读出字符串
				buf = data.getBytes();// 把字符串转换成字节数组,以便传送
				InetAddress address = packet.getAddress();// 获得从客户端packet的地址
				int port = packet.getPort(); // 获得端口号
				packet = new DatagramPacket(buf, buf.length, address, port);// 根据客户端信息创建数据报Packet对象
				socket.send(packet); // 发送数据报
			} catch (IOException e) {// 捕获异常
				System.out.println("信息处理出错:" + e.getMessage());
				moreQuotes = false; // 标识为false,以结束循环
			}
		}
		socket.close(); // 关闭数据报套接字
	}

	protected String getFileInfo() {// 读取文件内容
		String returnValue = null;// 声明要返回的数据
		try {
			if ((returnValue = in.readLine()) == null) {// 从文件中按每行读取数据
				in.close(); // 如果读到了文件尾,关闭输入流
				moreQuotes = false;// 标识为false,以结束循环
				returnValue = "读取文件信息完毕...";
			}
		} catch (IOException e) {// 捕获异常
			returnValue = "读取文件信息出错...";
		} finally {// 内容总执行
			System.out.println("文件内容:" + returnValue);
		}
		return returnValue; // 返回字符串
	}

	public static void main(String[] args) {// java程序主入口处
		try {
			new MuliticastServer().start();// 实例化对象并启动线程
		} catch (IOException e) {// 捕获异常
			System.out.println("实例化对象启动线程出错:" + e.getMessage());
		}
	}
}

操作UDP实现数据报传送的客户端

package net.xsoftlab.baike;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class MuliticastClient {
	protected static boolean NoRead = false;// 标志变量,是否继续操作

	public static void main(String[] args) {// java程序主入口处
		try {
			DatagramSocket socket = new DatagramSocket();// 创建数据报Socket对象
			InetAddress address = InetAddress.getByName("127.0.0.1");// 根据域名创建主机地址对象
			while (!NoRead) {// 标识为真循环
				byte[] buf = new byte[256];// 创建缓冲区
				DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 1111);// 由缓冲区创建数据报Packet对象
				socket.send(packet); // 发送信息
				packet = new DatagramPacket(buf, buf.length);
				// 由缓冲区创建数据报Packet对象,用来接收数据报
				socket.receive(packet); // 接收信息
				String received = new String(packet.getData());// 将接收到的信息转化成字符串
				if (received == null || received.equals(""))
					NoRead = true;
				System.out.println("从服务器端获得的数据报:" + received);
			}
			socket.close();// 释放资源
		} catch (Exception e) {// 捕获异常
			System.out.println("获取服务器端信息出错:" + e.getMessage());
		}
	}
}


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消