美文网首页
Java Socket 网络编程常见异常

Java Socket 网络编程常见异常

作者: SnailFast | 来源:发表于2019-09-16 21:58 被阅读0次

java.net.SocketTimeoutException

        指超时错误。超时分为连接超时读取超时,连接超时是指在调用 Socket.connect 方法的时候超时,而读取超时是调用 Socket.read 方法时超时。请你注意的是,连接超时往往是由于网络不稳定造成的,但是读取超时不一定是网络延迟造成的,很有可能是下游服务的响应时间过长。

java.net.BindException: Address already in use: JVM_Bind

        指端口被占用。当服务器端调用 new ServerSocket(port) 或者 Socket.bind 函数时,如果端口已经被占用,就会抛出这个异常。我们可以用netstat –an命令来查看端口被谁占用了,换一个没有被占用的端口就能解决。

java.net.ConnectException: Connection refused: connect

        指连接被拒绝。当客户端调用 new Socket(ip, port) 或者 Socket.connect 函数时,可能会抛出这个异常。原因是指定 IP 地址的机器没有找到;或者是机器存在,但这个机器上没有开启指定的监听端口。

        解决办法是从客户端机器 ping 一下服务端 IP,假如 ping 不通,可以看看 IP 是不是写错了;假如能 ping 通,需要确认服务端的服务是不是崩溃了。

java.net.SocketException: Socket is closed

        指连接已关闭。出现这个异常的原因是通信的一方主动关闭了 Socket 连接(调用了 Socket 的 close 方法),接着又对 Socket 连接进行了读写操作,这时操作系统会报“Socket 连接已关闭”的错误。

java.net.SocketException: Connection reset/Connect reset by peer: Socket write error

        指连接被重置。这里有两种情况,分别对应两种错误:第一种情况是通信的一方已经将 Socket 关闭,可能是主动关闭或者是因为异常退出,这时如果通信的另一方还在写数据,就会触发这个异常(Connect reset by peer);如果对方还在尝试从 TCP 连接中读数据,则会抛出 Connection reset 异常。

        为了避免这些异常发生,在编写网络通信程序时要确保:

        a)程序退出前要主动关闭所有的网络连接。

        b)检测通信的另一方的关闭连接操作,当发现另一方关闭连接后自己也要关闭该连接。

java.net.SocketException: Broken pipe

        指通信管道已坏。发生这个异常的场景是,通信的一方在收到“Connect reset by peer: Socket write error”后,如果再继续写数据则会抛出 Broken pipe 异常,解决方法同上。

java.net.SocketException: Too many open files

        指进程打开文件句柄数超过限制。当并发用户数比较大时,服务器可能会报这个异常。这是因为每创建一个 Socket 连接就需要一个文件句柄,此外服务端程序在处理请求时可能也需要打开一些文件。

        你可以通过lsof -p pid命令查看进程打开了哪些文件,是不是有资源泄露,也就是说进程打开的这些文件本应该被关闭,但由于程序的 Bug 而没有被关闭。

        如果没有资源泄露,可以通过设置增加最大文件句柄数。具体方法是通过ulimit -a来查看系统目前资源限制,通过ulimit -n 10240修改最大文件数。

查看服务器连接数

        netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

相关文章

网友评论

      本文标题:Java Socket 网络编程常见异常

      本文链接:https://www.haomeiwen.com/subject/crvsyctx.html