最近偶发情况虾遇到字符乱码问题如下:
最开始以为是jython的bug,后来定位发现是dboss readLine的实现上, 应该是byte处理的问题,之前的实现是:
public String readLine(int length) throws IOException { String buf = ""; int index = 0; while (true) { index = buf.indexOf("\r\n"); if (index >= 0) { break; } int bytesToRead = Math.min(input.available(), length); if (bytesToRead > 0) { byte[] data = new byte[bytesToRead]; input.read(data); String line = new String(data, DbossClientConstant.ENCODE); buf += line; } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } return buf.substring(0, index); }
这个存在一个问题,每次从缓存区读取byte都转换成string,有可能存在读取到一一半的byte,导致乱码。修改之后的代码:
public String readLine(int length) throws IOException { int bytesToRead = Math.min(input.available(), length); ByteArrayOutputStream output = new ByteArrayOutputStream(bytesToRead); int index = 0; byte[] buffer = null; while (true) { buffer = output.toByteArray(); index = ToolUtil.indexOf(buffer, EOF); if (index >= 0) { break; } bytesToRead = Math.min(input.available(), length); if (bytesToRead > 0) { byte[] bytes = new byte[bytesToRead]; input.read(bytes); output.write(bytes); } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } return new String(buffer, DbossClientConstant.ENCODE); }
ps:还有后续问题: 记录一次bug解决过程
相关推荐
DBOSS和BOSS15接口业务消息规范标准.doc
绝对是反编译工具中的神器,安装后直接鼠标右键一键反编译,回编译,非常方便, 这是今年最新版2.0.0,本人已在使用中, 推荐给大家。 备注:《Android APK+Dex文件反编译及回编译工具(APKDB)》 简称:APKDB ...
unity超精致BOSS模型(含动作) FBX格式文件,高模!大家快来下载吧!
chromedriver-win64-136.0.7059.0.zip
python学习一些项目和资源
python学习资源
python学习资源
python学习教程
python学习教程
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
内有各个系统的版本全了
分数阶模型辨识,分数阶模型辨识
大数据基于python的电影天堂数据可视化(源码+配套文档) 系统功能: 登录 、首页 、电影数据管理 、我的信息 关键技术:Python、Django、Mysql、Hadoop、Scrapy、Vue、B/S 技术支持:已测试可正常运行,调试问题可联系客服有偿解决。 更多项目:3000+优质源码,支持【定制】、修改、部署、讲解和文档。
【毕业设计】java-springboot+vue疾病防控综合系统的设计与实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot-vue家具销售电商平台实现源码(完整前后端+mysql+说明文档+LunW).zip
134dfffffffffffffffffffffffffffffff
代码说明: 设置结束时间:通过new Date().getTime()获取当前时间戳,并加上10分钟的毫秒数(10 * 60 * 1000),得到倒计时的结束时间。 更新倒计时:updateCountdown函数计算当前时间与结束时间的差值,并将其转换为分钟和秒数。 显示倒计时:通过console.log输出剩余时间,格式为“剩余时间:X分Y秒”。 停止倒计时:当剩余时间小于或等于0时,清除定时器并输出“时间到!”。 定时器:使用setInterval每秒调用一次updateCountdown函数,实现倒计时的动态更新。 扩展说明: 应用场景:倒计时功能常用于限时抢购、考试计时、活动倒计时等场景。 优化建议:可以将倒计时显示在网页的某个元素中,而不是控制台。例如,使用document.getElementById获取DOM元素并更新其内容。 兼容性:该代码在现代浏览器中均可运行,如果需要兼容旧版浏览器,可以使用var代替const和let。 扩展功能:可以添加声音提示、动画效果等,提升用户体验。
该项目是一个大学生校园兼职平台。该平台使用Java语言开发后台业务逻辑,运用了SpringMVC+Spring+MyBatis框架进行搭建,前台使用jQuery、layUI框架,数据库服务器采用MySQL5.6+对数据进行持久化。其主要功能有:兼职招聘、论坛交流、在线聊天、个人中心、信箱留言、登录注册等功能。
图解AUTOSAR-CP-CommunicationStackTypes逻辑图打包
解释程序的逻辑和变量等等