Java实现模拟路由功能

本文实现根据路由表适配最优的号段,选择路由器。选择路由的规则:

1、号段num和网元都不能重复

2、号段num不能重复

3、选择号码适配长度最长的网元为路由目的地

RouterService.java

package com.discover.router;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * 简易路由器
 * @author Administrator
 *
 */
public class RouterService {
    HashMap<String, String> routerInfoMap = new HashMap<String, String>();
    /**
     * 载入路由表规则:
     * 1、号段num和网元都不能重复
     * 2、号段num不能重复
     * @param routerRule 路由规则
     * @return
     */
    public boolean loadRule(String routerRule) {
        try {
            Document doc = DocumentHelper.parseText(routerRule);
            Element routertable = doc.getRootElement();
            Iterator routerIterator = routertable.elementIterator("router");
            while(routerIterator.hasNext())
            {
                Element router = (Element) routerIterator.next();
                String num = router.elementTextTrim("num");
                String net = router.elementTextTrim("net");
                if(num.isEmpty()||net.isEmpty())
                {
                    return false;
                }

                if(routerInfoMap.containsKey(num))
                {
                    return false;
                }
                else {
                    routerInfoMap.put(num, net);
                }

            }
        } catch (Exception e) {
            return false;
        }

        return true;
    }

    /**
     * 选择路由
     * 1、选择号码适配长度最长的网元为路由目的地
     * @param phone 电话号码
     * @return
     */
    public String selRouter(String phone) {
        Iterator iterator = routerInfoMap.entrySet().iterator();
        String num = "";
        String net = "";
        while (iterator.hasNext()) {
            Entry<String, String> entry = (Entry<String, String>)iterator.next();
            String key = entry.getKey();
            if(phone.indexOf(key)>-1)
            {
                if(key.length()>num.length())
                {
                    net = entry.getValue();
                }
            }
        }

        return net;
    }
}

采用JUnit对路由模拟器进行测试

TestRouterService.java

package com.discover.test;

import junit.framework.TestCase;

import com.discover.router.RouterService;

/**
 * @author Administrator
 *
 */
public class TestRouterService extends TestCase {
    public void testcase1() {
        RouterService routerService = new RouterService();
        String routerRule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            +"<routertable><router><num></num><net>router1</net></router></routertable>";
        assertEquals(false, routerService.loadRule(routerRule));
    }

    public void testcase2() {
        RouterService routerService = new RouterService();
        String routerRule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            +"<routertable><router><num>13567</num><net></net></router></routertable>";
        assertEquals(false, routerService.loadRule(routerRule));
    }

    public void testcase3() {
        RouterService routerService = new RouterService();
        String routerRule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            +"<routertable><router><num>13567</num><net>router1</net></router>"
        +"<router><num>13567</num><net>router2</net></router></routertable>";
        assertEquals(false, routerService.loadRule(routerRule));
    }

    public void testcase4() {
        RouterService routerService = new RouterService();
        String routerRule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            +"<routertable><router><num>13562</num><net>router1</net></router></routertable>";
        assertEquals(true, routerService.loadRule(routerRule));
        assertEquals("router1", routerService.selRouter("13562779908"));
    }

    public void testcase5() {
        RouterService routerService = new RouterService();
        String routerRule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            +"<routertable><router><num>13562</num><net>router1</net></router>"
            +"<router><num>135627</num><net>router2</net></router></routertable>";
        assertEquals(true, routerService.loadRule(routerRule));
        assertEquals("router2", routerService.selRouter("13562779908"));
    }
}

测试结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-30 15:16:50

Java实现模拟路由功能的相关文章

javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)

引言: 此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  --> javamail模拟邮箱功能发送电子邮件-基础实战篇 上一篇章简单讲解了javamail发送邮件的基本基础和用到的几个类,并且所有初始化和发送方法都封装在一个类里面(为了代码方便演示),本章节将对各个模块进行拆分和优化,并且引入附件发送的方法 要想邮件发送附件,就要引入两个新类  Multipart 和 BodyPart 两类 Multipart(报文部件容器) 实则为一个报文容器,而邮件消息  Msage 是由各个子

Java UDP实现聊天功能代码

我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务器端需要阻塞式等待客户端的连接.而UDP则是可以直接向目的地址的目的端口上发送数据包,由于它只负责发送出去就好,不管对方是否正确接受到与否,所以当网络性能不好时它容易出现丢包的问题.(注意:UDP是基于数据报为单位进行传输的,而TCP是一种基于流进行传输的) 但是UDP很好的模拟了我们呢平时聊天的方式,可以很好的实现连续多次发送和接受,也就是简单的QQ聊天的功能. 现在来简要介绍Java中有关UDP编程相关的类:

javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一篇了,上次更新完查看方法后,本打算周末更新的,没想今天周五挺闲,就地正法算了...就赶紧再下班前写完了.阅读本章节前建议阅读之前章节,因为这章是在之前的基础上增加的业务方法,不看之前的可能有点云里雾里.  点我前往 邮件标志:是指给邮件message对象设置一个Flag内部类里的属性字段,标志类型会

javamail模拟邮箱功能收取电子邮件-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)

引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  -->javamail模拟邮箱功能发送电子邮件-中级实战篇[新增附件发送方法](javamail API电子邮件实例) 在上一篇中,讲解了邮件发送的两个基本方法(HTML和附件),并且引入了两个新类 Multipart 和 BodyPart 两类,整体结构比较紧凑,邮件的服务

javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  -->javamail模拟邮箱功能获取邮件内容-中级实战篇[内容|附件下载方法](javamail API电子邮件实例) 在上一篇中,讲解了邮件获取内容的两个方法(HTML和附件),简单介绍了邮件发送和内容获取的相同和不同之处,并且引入了新类-->javax.mail.St

SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用、Zuul 路由功能、zuul 过滤访问、Zuul 服务降级)

1.概念:Zuul 路由访问 2.具体内容 在现在为止所有的微服务都是通过 Eureka 找到的,但是在很多的开发之中为了规范微服务的使用,提供有一个路由的处理控制组件:Zuul,也就是说 Zuul 就作为中间的一个代理层出现. 2.1.Zuul 的基本使用 本次使用 Zuul 将访问无安全认证的微服务信息,例如:公司信息就属于无安全认证的微服务: 1. 为了突出 zuul 的功能,建立一个新的主机映射: 127.0.0.1 gateway-9501.com 以后所有的微服务的访问不再直接进行处

Java 基本数据类型 sizeof 功能

Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int     32bitshort   16bitlong    64bitbyte    8bitchar    16bitfloat   32bitdouble  64bitboolean 1bit,This data type represents one bit of information, but its

微服务之API网关 kong 使用场景之路由功能

API网关,在介绍spring cloud的时候我们也曾提到过zuul,并使用zuul做了一个简单的实验证明zuul是可以实现网关的路由功能的,在这篇文章中,我们会同样使用类似简单的例子来验证kong在此种场景下的使用. spring cloud之zuul的类似实现 spring cloud的zuul的类似功能和实现,可参看下文: spring cloud之api网关 https://blog.csdn.net/liumiaocn/article/details/53941354 场景说明 项目

GNS3从零开始第四弹(使用GNS3模拟交换机功能)

话不多说我们开始做实验.首先添加一个设备. 因为我们添加的是一个路由设备,我们要把他更换成一个交换机设备. 点击更换. 这样我们的交换机就更换成功.只有两个接口,但这两个接口不要去用,这是用来接收跟输出的.如果要连上PC机的话我们要添加一块工作板. 右击点击设置. 添加一个16口的一个设置,点击应用然后确定. 这样交换机的接口就变得很多,而且以0开头跟1口区别开来,我们要链接1开头的接口. 接下来我们再添加两台PC机然后用网线使他们相连,注意接口. 然后运行我们的模拟设备,双击模拟设备,就进入了