先声明一下:最近在做android的开发! 因为要与服务器通信,服务器使用的mina框架,为了保持一致,方便性,在构建客户端网络层的时候,也使用了mina框架!
写一些对与mina框架对于android端的一些认识,欢迎广大童鞋拍砖!
先写遇到的问题吧!那个是相当的郁闷!
最开始的时候,先拿连接服务器端的demo在自己机器构建一般的工程跑(还没在android里面跑),跑的很顺利,很欢畅!可以一把demo移值到android里面,就开始在客户端报错!信息可以正常的发送给服务器,服务器也返回了信息,可客户端收到的信息是一堆乱码:错误信息如下
09-02 07:08:50.488: INFO/System.out(1036): 发生异常:java.nio.charset.MalformedInputException: Length: 1 (Hexdump: 00 00 00 4F 30 31 30 31 26 30 30 30 30 30 31 26 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 26 30 30 30 40 B2 E2 CA D4 D3 C3 BB A7 31 26 B8 DF CB D9 BD BB BE AF D6 A7 B6 D3 26 B8 DF CB D9 BD BB BE AF D6 A7 B6 D3 B6 FE B4 F3 B6 D3 26 31 2E 30 2E 31)
开始还以为是字符串编码问题! 开始跟服务器端商量编码问题! 调试了若干次,从GB2312到UTF-8;从发送到接受,都没有用!服务器发过来在客户端解析是一堆二进制数字,真是坑爹的呀!还想着要不去解析这些二进制编码吧! 后来想想这不是扯淡的,那么多业务都这么干不累死了!于是开始努力学习mina框架,各种求救!百度-谷歌! 在优快云下载频道里面发现有DEMO 下载下来 才TMD坑爹的,跟android没有一点关系! 后来在一边学习,一边找的过程中,发现了 珍惜所有 这位好人呀!他说android端可以使用mina框架,到这里才安心下来,只要别人可以用,俺也可以用的! 他给出的上面问题的解释是:盗用下,jdk版本引起的异常 ,这个不好解决 即便把服务器换成jdk1.5也不一样正常,因为android中jdk做过改动!先这么解析着吧,要是有什么高人明白这里是为什么的,求解答!
好吧下面上代码,说说android里面使用mina框架的传对象!
客户端代码:4个类
User类
import java.io.Serializable;
/***
* @version 1.0
* @author why
* @time 2011-8-2
* 用户类
*/
public class User implements Serializable{
/**
* 记着一定要对象序列化
*/
private static final long serialVersionUID = 7213525123562740058L;
private String name;
private String password;
private int id;public User() {
}
public User(String name, String password, int id) {
super();
this.name = name;
this.password = password;
this.id = id;
}
public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getPassword() {
return password;
}public void setPassword(String password) {
this.password = password;
}public int getId() {
return id;
}public void setId(int id) {
this.id = id;
}@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ "]";
}
}---------------------------------------------------ClientHandler 类-----------------------------------------------------------------------------
IOhandler实现类 用mina框架要必须实现的public class ClientHandler extends IoHandlerAdapter {
private final static Logger logger = LoggerFactory
.getLogger(ClientHandler.class);
private final Object values;public ClientHandler(Object values) {
System.out.println(10);
this.values = values;
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println(11);
session.write(values);
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("收到信息:" + message.toString());}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("发送信息:" + message.toString());
}
}---------------------------------------------------MyClientObject 类-----------------------------------------------------------------------------
注册监听器
public class MyClientObject {
public MyClientObject() {
IoConnector connector = new NioSocketConnector();
//设置连接超时时间
connector.setConnectTimeout(3000);
//添加过滤器
// 对象编解码
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new ObjectSerializationCodecFactory()));
System.out.println(4);
//传送USer对象
User user = new User("EHL","EHL1234",1234);
connector.setHandler(new ClientHandler(user));
// 建立连接
connector.connect(new InetSocketAddress("10.0.2.2", 8888));
}}
---------------------------------------------------main 类-----------------------------------------------------------------------------
android活动类public class main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println(1);
new Thread() {
public void run() {
new MyClientObject();
}
}.start();
System.out.println(1000);
}
}客户端主要代码是对象编解码
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new ObjectSerializationCodecFactory())); 这个要和服务器端保持一致!
---------------------------------------------------服务器端-----------------------------------------------------------------------------------------
------------------------------------------------------一定要长--------------------------------------------------------------------------------------
下面是服务器端的简单搭建 3个类
user类
要和上面client端的保持一致!
---------------------------------------------------MyIoHandler 类-----------------------------------------------------------------------------
IOhandler类的实现类
public class MyIoHandler extends IoHandlerAdapter {
private final static Logger log = LoggerFactory.getLogger(MyIoHandler.class);
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
//使用对象序列化
User user = (User)message;
String str = user.toString();
log.info("The message received is "+str);
System.out.println("收到消息:"+str);
session.write(user);
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("发送给客户端的信息:"+message.toString());
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("<关闭连接:"+session.getRemoteAddress()+">");
}@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("<建立连接:"+session.getRemoteAddress()+">");
}
}---------------------------------------------------MyServer 类-----------------------------------------------------------------------------
服务端的启动类
public class MyServer {
public static void main(String[] args) {
IoAcceptor acceptor = new NioSocketAcceptor();
// 设置读取缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 读写通道在10秒内无任何操作就进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 添加过滤器
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new ObjectSerializationCodecFactory())); // 对象编解码
try {
//注册handler
acceptor.setHandler(new MyIoHandler());
// bind 监听端口
acceptor.bind(new InetSocketAddress(8888));
System.out.println("服务端启动...............监听8888端口");
} catch (IOException e) {
e.printStackTrace();
}
}
}以上就是完成的客户端和服务器端使用mina通信传对象的代码,写的比较乱,里面加载一些测试的东西,懒得删哈!欢迎广大童鞋给扔砖,在这里要感谢下 珍惜所有 对俺的帮助! 有啥疑问可以QQ联系:583417398 一起学习!
后记:我的环境是用的2.3的SDK,2.3以前的版本会出现问题。关于问题解决方案
http://blog.youkuaiyun.com/whyisjava/article/details/7444644 这里有!