美文网首页
java TinyRadius包详解

java TinyRadius包详解

作者: PigPIgAutumn | 来源:发表于2018-01-16 18:15 被阅读0次

包结构:
1.RadiusServer
2.RadiusClient
3.RadiusPacket
4.RadiusAttribute

RadiusServer:

成员变量:

ExecutorService executor
默认为空,即RadiusServer默认不会开启多线程,需要我们自己派生子类来开启多线程处理请求

函数:

RadiusServer.start()
调用该函数后,服务器会启动两个线程分别监听指定的两个端口(auth,acct),其中一个端口用来进行用户认证,另一个端口用来进行计费认证
boolean isPacketDuplicate(RadiusPacket packet, InetSocketAddress address)
该函数用于判断收到的包是否最近就已经接收过,这个时间默认是3s,并将已接收的包存在一个linkedlist中,每次收到包时,都会遍历一次这个linkedlist,将过期的包去掉,并逐个对比收到的包,看是否重复,而且这个函数是加了同步锁的,即遍历是单线程的,高并发下性能非常差,需要改成用缓存

RadiusPacket:

函数:

encodepacket()
对符合radius协议的报文进行编码,输出字节流
decodepacket()
对符合radius协议的报文进行解码,从字节流构造成RadiusPacket类型的变量

这里对部分代码进行解释:

...
        DataOutputStream dos = new DataOutputStream(out);
        dos.writeByte(getPacketType());
        dos.writeByte(getPacketIdentifier());
        dos.writeShort(packetLength);
        dos.write(getAuthenticator());
        dos.write(attributes);
        dos.flush();
...

上面的这段代码是RadiusPacket.encodepacket()方法中的代码,接下来看看decodepacket()中的这段代码:

/**这里in.read()返回的是8位的byte类型变量,而java里面的int是32位的,为了不造成误差,必须将高24位清0,所以要与一下0x0ff***/
        /**in.read()一次读取一个字节(1byte)**/
        int type = in.read() & 0x0ff;
        int identifier = in.read() & 0x0ff;

        /**encode时length是short类型,16位,所以in.read()需要分两次读取,第一次读取的值需要左移8位再或操作拼接上第二次读取的值**/
        int length = (in.read() & 0x0ff) << 8 | (in.read() & 0x0ff);

因为InputStream.read()一次只会读取一个字节,java中int是32位的,所以需要和0x0ff进行与运算,才能把byte转换为int,同样地,short需要read()两次才能读取完,并且第一次读取的值需要左移8位再拼上第二次读取的值才能转换为int

RadiusAttribute

该类主要用于存储radius报文的属性字段,在TinyRadius中,RadiusAttribute在编码时会被转换为字节数组,该数组长为2+属性值的字节长度,原因在于字节数组首元素存储属性值的类型,次元素存储属性值的长度,方便解码时转换回来

还有其他类我还没有时间继续了解,以后回来继续完善

相关文章

  • java TinyRadius包详解

    包结构:1.RadiusServer2.RadiusClient3.RadiusPacket4.RadiusAtt...

  • java数据库连接

    java.sql包详解 数据类型 枚举 API相关 驱动相关 异常 作为Java开发人员需要掌握的API java...

  • Thread类详解以及创建线程的四种方法

    1.Thread 类详解 Thread类是Java语言中重要的基础类,位于java.lang包中。Thread类有...

  • FreeMarker | 笔记篇

    java中Freemarker list指令详解 java中Freemarker if else指令详解 java...

  • Java:常用包详解

    java.lang 该包提供了Java编程的基础类,例如 Object、Math、String、StringBuf...

  • java io包详解

    文件传输的样例(使用DataOutputStream ):https://blog.csdn.net/u01015...

  • java闭包详解

    提到闭包,大家可能都想到js,闭包是函数式编程语言中常用的特性,使用它可以在一些特别的功能中维持某种状态的存在。 ...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

  • Java注解

    Java注解(Annotation)详解(一)——概述及JDK自带注解 Java注解(Annotation)详解(...

  • 回归Java基础,详解 Java 内部类

    回归Java基础,详解 Java 内部类

网友评论

      本文标题:java TinyRadius包详解

      本文链接:https://www.haomeiwen.com/subject/wjheoxtx.html