MINA实战
- cmd的len就是真实的len,而不需要/2了;
- timer的定时任务,start并不执行,只有在第一个interval时间过后才会第一次执行;
- paddLeft的使用:"Jim",使用padLeft(5,'0')之后,就是00Jim;
- bit(位)是传输单位,二进制的0、1;Byte(字节)是最小的数据存储单位;1Byte = 8Bit;一个英文字母、数字、半角标点都是1Byte(字节);在传递命令中,路径就是
1)Encoding.UTF8.GetBytes(cuseeion),将文字转换为字节;
2)就每一个字节转换为16进制
StringBuilder sb = new StringBuilder(data.Length * 3);
- bit(位)是传输单位,二进制的0、1;Byte(字节)是最小的数据存储单位;1Byte = 8Bit;一个英文字母、数字、半角标点都是1Byte(字节);在传递命令中,路径就是
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
return sb.ToString().ToUpper();
3)将
- 使用ByteArrayToHexString(bb.ToByteArray())的方法,可以获得最终传输到命令服务器的内容(00002715XXX);对于协议中描述的"FFFF0A000000000001014D025B"而言,其实已经是经过16进制编码的,所以对于把这部分压入到ByteBuffer,直接用HexStringToByteArray(" FFFF0A000000000001014D025B")即可;
- 将字符串转换为byte[]其实是对字符串的char进行ASCII编码(基于10进制编码),在ByteArrayToHexString中因为采用了16进制进行编码,这就有问题:两位的十进制字节可能一位16进制字节即可,于是采用PadLeft进行补位处理,这也是我们看到的在协议中定义的比如MAC地址32位(字节,或者说字母数字),但是其实是64位长,就是在转成byte[]转16进制的时候,固定做两位长度。
- Socket对象中的SendTimeout和ReceiveTimeout默认值是0,代表无线等待;有的时候我们可以通过设定超时时间来判定操作的成功与否
- substring,endIndex是不包含在截取范围里面的;
- byte数组长度是16进制字符长度的两倍;所以如果协议长度为长度为4,指的是数组长度;那么在截取协议长度应该是8;
- 使用logback,不再需要log里面使用System.out.println(...);
- logback之所以需要传递class,其实是为了输出class名称;因为在配置appender的encoder的时候,可以通过指定%c(注意小写c)来指定输出log名称,如果你传入的是this.getClass()为参数,那么输出的内容就是class的类名称(其实内部处理是getClassName()然后当做这个log的名称);如果一个log的名称没有配置到logback.xml中,那么将继承root的输出级别;
- logback的Appender中的filter也有一个级别;这个级别如果是level级别(ch.qos.logback.classic.filter.LevelFilter),那么要求必须一致才会让这个appender进行输出(可以通过onMatch以及OnMisMatch配置来实现);如果是ch.qos.logback.classic.filter.ThresholdFilter,就是和传统意义的级别一样,只有平行和高于这个级别的日志请求才会被输出;
- 使用logback其实只要把logback.xml放入到resource文件夹下即可(resource文件件是手工创建的"Source Foler";
- 不要再尝试计算多少位,然后取出数组位数,在进行16进制转换;你需要做的就像下面,MINA的IOBuffer已经替你做了位移和16进制转换之类的事情了:
- 如果想要让业务出现的异常达到控制台上面,需要通过
e.printStackTrace()方式来让异常信息输出到控制台上面;采用"throws Exception"方式如果不是在外层进行捕获,仍然无法输出到控制台;比较好的方式是在底层采用throws Exception,在外面某一层通过try…catch的方式进行捕获,统一输出; - 开始客户端可以和服务器通信,但是服务器和客户端传输数据总是失败;后来发现之前是直接session.write(XXX),参数内容是字符串;如果是直接字符串,客户单以及服务器必须要相应的解码/编码过滤器;如果没有,则必须要通过传递IoBuffer的方式让write来进行写,如下图所示:
客户端终于接收到了服务器端的数据; - 在使用iBatis的时候:发生如下错误:Type interface intelliFarming.cmdSvr.service.dao.IDeviceDao is not known to the MapperRegistry.后来确认错误是因为dataSource的xml文件。
- 在windows2008上面安装完毕了mysql之后,远程无法访问;本地连接没有问题;1.登录用户的Host字段改为"%";2.安装完毕了Mysql之后,尽管它把3306端口打开,但是在防火墙里面看到新添加了两个入栈规则分别是"专有"以及"域";需要把他们其中任意一个增加勾选"公用"即可