MINA实战

  1. cmd的len就是真实的len,而不需要/2了;
  2. timer的定时任务,start并不执行,只有在第一个interval时间过后才会第一次执行;
  3. paddLeft的使用:"Jim",使用padLeft(5,'0')之后,就是00Jim;
    1. bit(位)是传输单位,二进制的0、1;Byte(字节)是最小的数据存储单位;1Byte = 8Bit;一个英文字母、数字、半角标点都是1Byte(字节);在传递命令中,路径就是
      1)Encoding.UTF8.GetBytes(cuseeion),将文字转换为字节;
      2)就每一个字节转换为16进制
      StringBuilder sb = new StringBuilder(data.Length * 3);

foreach (byte b in data)

    sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));

return sb.ToString().ToUpper();

3)将

  1. 使用ByteArrayToHexString(bb.ToByteArray())的方法,可以获得最终传输到命令服务器的内容(00002715XXX);对于协议中描述的"FFFF0A000000000001014D025B"而言,其实已经是经过16进制编码的,所以对于把这部分压入到ByteBuffer,直接用HexStringToByteArray(" FFFF0A000000000001014D025B")即可;
  2. 将字符串转换为byte[]其实是对字符串的char进行ASCII编码(基于10进制编码),在ByteArrayToHexString中因为采用了16进制进行编码,这就有问题:两位的十进制字节可能一位16进制字节即可,于是采用PadLeft进行补位处理,这也是我们看到的在协议中定义的比如MAC地址32位(字节,或者说字母数字),但是其实是64位长,就是在转成byte[]转16进制的时候,固定做两位长度。
  3. Socket对象中的SendTimeout和ReceiveTimeout默认值是0,代表无线等待;有的时候我们可以通过设定超时时间来判定操作的成功与否
  4. substring,endIndex是不包含在截取范围里面的;
  5. byte数组长度是16进制字符长度的两倍;所以如果协议长度为长度为4,指的是数组长度;那么在截取协议长度应该是8;
  6. 使用logback,不再需要log里面使用System.out.println(...);
  7. logback之所以需要传递class,其实是为了输出class名称;因为在配置appender的encoder的时候,可以通过指定%c(注意小写c)来指定输出log名称,如果你传入的是this.getClass()为参数,那么输出的内容就是class的类名称(其实内部处理是getClassName()然后当做这个log的名称);如果一个log的名称没有配置到logback.xml中,那么将继承root的输出级别;
  8. logback的Appender中的filter也有一个级别;这个级别如果是level级别(ch.qos.logback.classic.filter.LevelFilter),那么要求必须一致才会让这个appender进行输出(可以通过onMatch以及OnMisMatch配置来实现);如果是ch.qos.logback.classic.filter.ThresholdFilter,就是和传统意义的级别一样,只有平行和高于这个级别的日志请求才会被输出;
  9. 使用logback其实只要把logback.xml放入到resource文件夹下即可(resource文件件是手工创建的"Source Foler";
  10. 不要再尝试计算多少位,然后取出数组位数,在进行16进制转换;你需要做的就像下面,MINA的IOBuffer已经替你做了位移和16进制转换之类的事情了:
  11. 如果想要让业务出现的异常达到控制台上面,需要通过

    e.printStackTrace()方式来让异常信息输出到控制台上面;采用"throws Exception"方式如果不是在外层进行捕获,仍然无法输出到控制台;比较好的方式是在底层采用throws Exception,在外面某一层通过try…catch的方式进行捕获,统一输出;
  12. 开始客户端可以和服务器通信,但是服务器和客户端传输数据总是失败;后来发现之前是直接session.write(XXX),参数内容是字符串;如果是直接字符串,客户单以及服务器必须要相应的解码/编码过滤器;如果没有,则必须要通过传递IoBuffer的方式让write来进行写,如下图所示:

    客户端终于接收到了服务器端的数据;
  13. 在使用iBatis的时候:发生如下错误:Type interface intelliFarming.cmdSvr.service.dao.IDeviceDao is not known to the MapperRegistry.后来确认错误是因为dataSource的xml文件。
  14. 在windows2008上面安装完毕了mysql之后,远程无法访问;本地连接没有问题;1.登录用户的Host字段改为"%";2.安装完毕了Mysql之后,尽管它把3306端口打开,但是在防火墙里面看到新添加了两个入栈规则分别是"专有"以及"域";需要把他们其中任意一个增加勾选"公用"即可

posted on 2014-07-19 18:58  下士闻道  阅读(519)  评论(0编辑  收藏  举报

导航