赞
踩
端口冲突。
这个问题出现的原因是服务器的端口不够用了,服务器总共有(0-65536)个端口。
异常的原因是服务端new ServerSocket(port)新建socket时,这个port已经占用并进行监听了。
此时可以使用netstat -an命令,查看这个端看到状态发现为Listending。出现这样的问题,只需要找一个没有被占用的端口就可以解决这个问题。
使用netstat -anp | grep 2181 (这里的端口号,替换成被占用的端口号,比如tomcat 8080等)
[root]# netstat -anp|grep 7777
tcp 0 0 0.0.0.0:17777 0.0.0.0:* LISTEN 484/nginx: worker p
tcp6 0 0 :::7777 :::* LISTEN 24452/java
tcp6 0 0 192.168.109.145:7777 192.168.109.144:53537 TIME_WAIT -
最后一排就是进程id(pid)。
使用ps -ef | grep 7777
[root]# ps -ef|grep 24452
root 19401 17271 0 16:50 pts/3 00:00:00 grep --color 24452
root 24452 2199 7 Sep06 ? 02:01:53 /usr/java/jdk1.8/bin/java -jar xxx-SNAPSHOT.jar
这样可以看到这个进程到底是什么。
pts那个是只想ps -ef|grep 7777生成的,就好像每次执行jps的时候,就有jps这个进程。
首先要确保这个进程可以被杀掉,千万不能谁便kill 进程。
kill -9 pid
kill -9 24452
要正确区分长、短连接。
所谓的长连接就是一经建立就永久保持。
短连接使用的场景是使用完立即关闭:准备数据–>建立连接–>发送数据–>关闭连接。
连接拒绝。
该异常发生在客户端进行new Socket(ip, port)操作时,原因是指定ip的地址不能找到(也就是ping 不通),或者ip存在但是指定的端口程序没有启动。
总之:TCP连接请求被拒绝是由于目标服务器上无对应的监听套接字(IP && PORT)。
这个问题主要是对长连接的维护。
所谓的维护包括两个方面,首先是检测对方的主动断连(即调用socket的close方法),其次是检测对方的宕机、异常退出、网络不同。
sokcet被关闭。
该异常在客户端和服务器均有可能发生。
异常的原因是自己主动把socket关闭了(调用socket的close方法),然后自己再对网络连接进行读写操作。
排查一下是否自己误操作把socket主动关闭了。
就是连接异常断开后,读和写操作引发的异常。
主要是对端的socket关闭了,本端没有感知到,继续对连接进行读写导致的。
该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个:
服务器关闭了某些连接,客户端感知不到继续读或者写都会报异常。
如果知道实际连接服务器的并发客户端数并没有超过服务器的承载量,则有可能是中了病毒或者木马,引起网络流量异常。
解决方法:可以使用netstat -an 命令查看网络连接情况。
如果网络连接通过防火墙,而防火墙一般都会有超时机制,在网络连接长时间不传输数据时,会关闭这个TCP的会话,关闭后客户端或服务器在读写都会导致异常。
解决方法:如果关闭防火墙,解决了问题,需要重新配置防火墙,或者自己编写程序实现TCP的长连接。实现TCP长连接,需要自己定义心跳协议,每隔一段时间,发送一次心跳协议,双方维持连接。
该异常在客户端和服务器均有可能发送。
在上面的java.net.SocketException:Connect reset by peer:Socket write error异常产生后,如果继续写数据则抛出该异常。
也就是对端关闭了socket,本地继续写数据导致该异常。
这个异常比较常见,socket超时。
一般有两个地方会抛出这个异常。
connet,socketTimeout这两个时间按实际业务场景合理的设置即可。
操作系统中打开的文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。
因为为了执行每个用户的应用,服务器都要打开很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。
当从输入流读取数据时,返回的读取字节数如果是-1的话,对于文件IO就表示文件读完了,也就是到了"end of file";如果是一个网络IO就表示输入流被关闭了。
再想想HTTP的知识,对于使用长连接的情况下,服务器通过网络输入流读取数据时,是通过请求头Content-Length来判断请求体是否被读取完的,意思就是服务器先会去解析请求头,
通过Content-Length就会知道请求体数据量的大小,然后再从输入流当中读取相应字节数的数据作为这个请求的请求体。
可以分析得出在正常情况下这个nRead是不应该为-1的,就是还有数据可以读出来,也就是还没有达到Content-Length所指定的数据量,然后输入流就关闭了。
就是服务器读数据的过程中读到了异常的文件结束标识(end of file),可能是客户端上传过程主动取消上传,或者网络不稳定导致数据流中断。
错误日志如下:
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Unexpected EOF read on the socket,可以看出在copy文件流的过程中抛出IOException,猜想是文件流的获取有异常,在开发环境进行验证在上传文件的过程中取消文件的上传,错误重现。
上传文件还没到末尾就被客户端中断,是超出客户端的tomcat文件连接时间。
原因,客户端带宽可能太小,导致上传一个文件花费的时间太长,超过了客户端项目的tomcat的连接时间。
客户端tomcat配置修改:
server.connectionTimeout =180000 (客户端上传连接时长)
TCP/IP:连接服务器失败(错误原因:Connection refused)
java.net.SocketException四大异常解决方案
客户端SpringBoot文件上传:java.io.EOFException: Unexpected EOF read on the socket
客户端文件上传错误:java.io.EOFException: Unexpected EOF read on the socket
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。