发送socketapi封装(涉及数据格式转换)
首先说说这个api,在windows环境,给本机的某个端口发送socket,然后这个端口已经被一个中间件绑定了,这个中间件就给远程设备发送,然后接受信息,并返回给我。解析信息。就这些!!!
由于就是一个api,思路挺简单的,记录下自己踩过的坑吧。
- 推荐一个软件 socketTool ,用这个软件可以很简单的发送socket请求,还可以作为server监控端口,查看收到的socket数据,很方便。
- socket发送十六进制和asc码 要求用socket发送十六进制和asc码混编的数据。这个愁坏我了,以前都是写业务系统的,突然整这个,整个人也是懵逼状态,但是,生活要进行,工作必须要继续啊。看一下发的东西
然后还有个下行命令,也就是结果。看了半天文档才知道发送的是什么。
直接说坑,发送的是byte字节,但是byte取值范围-128~127,比如0x80就对应了十进制的128,这里发送什么就不知道了。开始的写法是一个list里添加byte,然后一起发送,但是发现明明发的是0x80,接收到的却不是,应该是因为超过127做的处理,最终是 byte[] 数组,直接赋值 128 ,就可以了。提供一个思路吧,遇见问题还是要按情况处理。 - 读取不结束 socket返回一个InputStream,byte[] 数组去读取这个流,但是程序就停在这了,也有读取到数据。结果网上查了资料,这里需要加is.available() == 0 来判断是否读完了。具体记不清是从哪个帖子看到了
- 解析十六进制数据 返回的数据也是十六进制和asc码混编的格式,还好有说明,然后逐个字节去解析,也能拿到结果。0x12解析到string格式,我就要拿到这个12,Integer.toHexString() 方法就可以直接拿到了,0x01拿到的就是1,而不是01。坑就是,解析0x81,到了十进制就是129了,但是你解析的是byte,结果前面就是 ffffff81 , 然后用 Integer.toHexString( 0x81 & 0xff) ,进行位与运算,去掉前面的内容就好啦。
- 考虑业务 最后一个不算是坑了,贴近业务吧。这个api有个功能是获取设备的使用权,但是已经被占用使用权的设备会报异常,提示已经被使用。但是你自己占用的仍然给这种提示。业务上应该是,你自己获取到了使用权,避免再次获取程序报异常,应该给返回一个获取成功,而不是被使用。
仅作为记录吧。