0%

socket-readLine-低级错误

记录一次使用关于通过netcat工具连接socket的问题吧

环境

本地环境
win10 企业版(2019-1206安装,奇怪不应该是专业版吗,而且我没重装系统呀,难道是上次注册表的问题?): 
netcat: v1.12 NT
jdk: 1.8.0_112
正式环境
ubuntu: 16.04.6
netcat: OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
jdk: 1.8.0_201-b09 

在写连接设备程序时,用到了

1
2
String sb = bufferedReader.readLine()
...

程序直接部署上去,结果一夜过后发现几个T的容量直接沾满了,导致数据库挂掉了。于是查看一下是因为此程序的log写满了,觉着奇怪。删掉日志文件,重新启动,日志也没有飞速增加。
但是,当我使用ubuntu的nc工具连接然后断开时,发现几乎以满IO的速度写入日志。发现 bufferedReader.readLine() 不断的获取到null,然后空指针异常填满了日志。于是程序改成了

1
2
3
while ((line = bufferedReader.readLine()) != null) {
...
}

这样改了之后,日志确实不会继续增加了,但是发现一个新的问题,每断开一个连接,cpu就会占满一个核,使用top命令发现%CPU指数基本为(断开次数*100%),于是发现是 nc 工具ctrl+c后不会关闭socket的问题。
因为我外部还套了一层循环,但是在windows使用nc测试时,如果断开连接则会抛出异常Connection reset,从而跳出循环。也就不存在什么资源占用的问题。但是ubuntu的nc命令,断开连接后,socket 仍然未关闭,可以不断的重新连接,然后while true readline。
查看了外套的循环的作用,发现基本是while true,可能是怕读取到空值后,断开连接,于是加了层循环,若读取到null后,重新获取inputstream继续readline,找了相关资料,socket发送null,基本就是等于断开连接了。于是删除此外套的循环,问题解决。