android里面怎么使用mina框架与mina服务器连接之传对象

本文介绍了在Android开发中如何使用Mina框架与使用Mina的服务器进行通信,特别是在处理对象序列化时遇到的问题及解决办法。在Android客户端,通过设置对象编解码器并创建IoConnector实现连接,服务器端则通过IoAcceptor监听并响应客户端消息。在实际运行过程中,客户端接收到的数据出现乱码,经过排查发现可能是由于JDK版本差异导致,但最终找到了绕过问题的方法,实现了客户端与服务器之间的对象传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先声明一下:最近在做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 这里有!

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值