package com.commsoft.server.client;
import java.net.*;
import java.nio.channels.*;
import java.nio.*;
import java.io.*;
import java.nio.charset.*;
import java.util.*;
import com.commsoft.server.util.Common;
/**
* <p>Title: 康索特AAA服务器</p>
* <p>Description: 客户端模拟类</p>
* <p>CpoyRight: Copyright (c) 2008</p>
* <p>Company: 康索特软件有限公司</p>
* @author 韦斯多
* @version 1.0.0.0
* 2008-10-14
*/
public class Client{
/**
* 数据报通道
*/
private DatagramChannel datagramChannel = null;
/**
* 报文发送缓冲区
*/
private ByteBuffer sendBuffer=ByteBuffer.allocate(2048);
/**
* 报文接受缓冲区
*/
private ByteBuffer receiveBuffer=ByteBuffer.allocate(2048);
/**
* 字符集处理类
*/
private Charset charset=Charset.forName("GBK");
/**
* 选择器
*/
private Selector selector;
/**
* 公用密钥
*/
private String key;
/**
* @param port 客户端监听端口号
* 构造函数
*/
public Client(int port)throws IOException{
key = Common.KEY; //初始化公用密钥
datagramChannel = DatagramChannel.open(); //创建一个数据报通道
InetAddress ia = InetAddress.getLocalHost(); //获取本地主机地址
InetSocketAddress isa = new InetSocketAddress(ia,port);
datagramChannel.configureBlocking(false); //设置为非阻塞模式
datagramChannel.socket().bind(isa); //与本地地址绑定
isa = new InetSocketAddress(ia,1812);
datagramChannel.connect(isa); //与远程地址连接
selector=Selector.open(); //创建选择器
}
/**
* 函数功能:启动客户端程序
* @param args
* @throws Exception
*/
public static void main(String args[])throws Exception{
int port=8000;
if(args.length>0)port=Integer.parseInt(args[0]);
final Client client=new Client(port);
//创建一个接收线程
Thread receiver=new Thread(){
public void run(){
try {
client.requestPacket();
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
};
//启动消息包接收线程
receiver.start();
//与服务器进行交互
client.talk();
}
/**
* 函数功能:组装认证请求报文
* @throws Exception
*/
public void requestPacket()throws Exception{
byte[] code = "1".getBytes(); //报文类型
byte[] identifier = "1".getBytes(); //报文标识
byte[] length = "48".getBytes(); //报文长度
byte[] authenticator = "8888888888888888".getBytes(); //报文验证字
byte[] attributeType = "1".getBytes(); //用户名标识
byte[] attributeLength = new byte[1]; //用户名属性长度
attributeLength[0] = 10;
byte[] attributeValue = "weisiduo".getBytes(); //用户名内容
byte[] attributeType1 = "2".getBytes(); //密码标识
byte[] attributeLength1 = new byte[1]; //密码属性长度
attributeLength1[0] = 18;
String password = Common.encryptionData(authenticator,"11111111",key); //对密码进行MD5加密
byte[] attributeValue1 = password.getBytes(); //密码内容
ByteBuffer bb = ByteBuffer.allocate(1024);
bb.clear();
bb.put(code);
bb.put(identifier);
bb.put(length);
bb.put(authenticator);
bb.put(attributeType);
bb.put(attributeLength);
bb.put(attributeValue);
bb.put(attributeType1);
bb.put(attributeLength1);
bb.put(attributeValue1);
sendBuffer = bb;
}
/**
* 函数功能:与服务器进行交互
* @throws IOException
*/
public void talk()throws IOException {
//注册通道
datagramChannel.register(selector,
SelectionKey.OP_READ |
SelectionKey.OP_WRITE);
while (selector.select() > 0 ){
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();
while (it.hasNext()){
SelectionKey key=null;
try{
key = (SelectionKey) it.next();
it.remove();
if (key.isReadable()) { //判断通道中是否有可读数据
receive(key);
}
if (key.isWritable()) { //判断通道是否可写数据
send(key);
}
}catch(IOException e){
e.printStackTrace();
try{
if(key!=null){
key.cancel();
key.channel().close();
}
}catch(Exception ex){e.printStackTrace();}
}
}
}
}
/**
* 函数功能:发送认证请求报文
* @param key
* @throws IOException
*/
public void send(SelectionKey key)throws IOException{
DatagramChannel datagramChannel=(DatagramChannel)key.channel();
synchronized(sendBuffer){
sendBuffer.flip(); //把极限设为位置
datagramChannel.write(sendBuffer);
sendBuffer.compact();
}
}
/**
* 函数功能:接收认证响应报文
* @param key
* @throws IOException
*/
public void receive(SelectionKey key)throws IOException{
DatagramChannel datagramChannel=(DatagramChannel)key.channel();
receiveBuffer.clear(); //清空接收缓冲区
datagramChannel.read(receiveBuffer); //将数据从通道中读取到接收缓冲区
receiveBuffer.flip();
String receiveData=decode(receiveBuffer); //对接收到的数据进行解码
System.out.println(receiveData);
}
/**
* 函数功能:对报文进行解码
* @param buffer 报文
* @return
*/
public String decode(ByteBuffer buffer){
CharBuffer charBuffer= charset.decode(buffer);
return charBuffer.toString();
}
/**
* 函数功能:对报文进行编码
* @param str 报文
* @return
*/
public ByteBuffer encode(String str){
return charset.encode(str);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
AAA_Server.rar_aaa SERVER
共56个文件
class:13个
java:12个
root:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 34 浏览量
2022-09-20
15:29:16
上传
评论
收藏 34KB RAR 举报
温馨提示
AAA服务器源码,用户验证授权等,本源码为服务端源码使用的java编写
资源推荐
资源详情
资源评论
收起资源包目录
AAA_Server.rar (56个子文件)
AAA_Server
bin
com
commsoft
server
client
Client$1.class 723B
Client.class 5KB
db
DBConnection.class 307B
service
Listening.class 4KB
RejectMessage.class 1KB
ResponseMessage.class 2KB
CheckUser.class 2KB
Server.class 614B
AcceptMessage.class 1KB
Filter.class 910B
RequestMessage.class 3KB
util
Common.class 2KB
MD5Util.class 2KB
CVS
Root 53B
Entries 97B
Repository 26B
.settings
org.eclipse.jdt.ui.prefs 99B
org.eclipse.jdt.core.prefs 633B
src
com
commsoft
server
client
CVS
Root 53B
Entries 45B
Repository 57B
Client.java 5KB
db
CVS
Root 53B
Entries 51B
Repository 53B
DBConnection.java 284B
CVS
Root 53B
Entries 51B
Repository 50B
service
Server.java 237B
Filter.java 1KB
CheckUser.java 2KB
CVS
Root 53B
Entries 397B
Repository 58B
RejectMessage.java 1KB
AcceptMessage.java 1KB
RequestMessage.java 4KB
ResponseMessage.java 3KB
Listening.java 4KB
util
CVS
Root 53B
Entries 91B
Repository 55B
MD5Util.java 2KB
Common.java 3KB
CVS
Root 53B
Entries 14B
Repository 43B
CVS
Root 53B
Entries 16B
Repository 34B
CVS
Root 53B
Entries 11B
Repository 30B
.project 387B
.classpath 304B
共 56 条
- 1
资源评论
局外狗
- 粉丝: 66
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功