最近跟进性能测试,碰到了各种各样的IOException,到处google,现把常见的网络异常大概的总结下。
1.java.net.SocketTimeoutException.这个异常比较常见,socket超时。一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(SocketAddress endpoint,int timeout)中的后者来决定,还有就是setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成0均表示无限大。
2.java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port) 或者socket.bind(SocketAddress bindpoint)操作时。
原因:与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。
3.java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)或者socket.connect(address,timeout)操作时.
原因:指定ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。应该首先检查客户端的ip和port是否写错了,假如正确则从客户端ping一下服务器看是否能ping通,假如能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动。
4.java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
5.java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端假如在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
对于服务器,一般的原因可以认为:
a) 服务器的并发连接数超过了其承载量,服务器会将其中一些连接主动Down掉.
b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。
6.java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。
对于4和5这两种情况的异常,需要特别注意连接的维护。在短连接情况下还好,如果是长连接情况,对于连接状态的维护不当,则非常容易出现异常。基本上对长连接需要做的就是:
a) 检测对方的主动断连(对方调用了Socket的close方法)。因为对方主动断连,另一方如果在进行读操作,则此时的返回值是-1。所以一旦检测到对方断连,则主动关闭己方的连接(调用Socket的close方法)。
b) 检测对方的宕机、异常退出及网络不通,一般做法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到对方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接。虽然Socket有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。
7.java.net.SocketException: Too many open files
原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。
解决方式:
a) 尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
b) java的GC不能关闭网络连接打开的文件句柄,如果没有执行close()则文件句柄将一直存在,而不能被关闭。也可以考虑设置socket的最大打开数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量。ulimit -a可以查看系统目前资源限制,ulimit -n 10240则可以修改,这个修改只对当前窗口有效。
分享到:
相关推荐
异常处理在Java Socket编程中扮演着重要角色。主要涉及四种异常类型: 1. `UnknownHostException`: 表示主机名或IP地址无法解析,通常是因为网络不可达或者主机名不存在。 2. `ConnectException`: 当尝试连接到...
在"Java常用代码整理"这个主题中,我们可以探讨多个Java编程中的关键知识点,包括基础语法、面向对象特性、异常处理、集合框架、IO流、多线程、网络编程以及实用工具类等。 1. **基础语法**:Java的基础语法包括...
此外,Java还强调了异常处理,通过try-catch-finally语句块来捕获和处理程序运行时可能出现的问题。异常处理有助于增强程序的稳定性,使错误处理更加有序。 在高级特性方面,Java 5引入了泛型,增强了类型安全,...
Java面试题整理集合 在Java领域,面试是评估求职者技术实力的重要环节。这份整理集合涵盖了Java编程语言的基础、进阶、并发、内存管理、框架等多个方面,旨在帮助准备面试的开发者全面了解并掌握Java的核心知识。...
5. **网络编程**:Java的Socket编程是网络通信的基础,包括TCP和UDP两种传输协议,以及ServerSocket和Socket的使用。 6. **IO流**:Java的IO流分为字节流和字符流,涉及输入流和输出流,还有缓冲流、转换流、对象流...
这份“java面试(整理).rar”压缩包文件显然包含了针对Java面试精心整理的资料,旨在帮助求职者准备面试,提升成功的机会。让我们深入探讨一下Java面试中可能会遇到的一些关键知识点。 1. **基础语法**:面试通常...
这份"JAVA核心知识整理"涵盖了Java编程的基础到高级概念,对于学习和掌握Java编程至关重要。以下是对核心知识点的详细阐述: 一、Java基础 1. **环境配置**:安装JDK(Java Development Kit),设置JAVA_HOME、PATH...
5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。 6. **字符串处理**:String类在Java中是不可变的,了解其常用方法如concat、substring、indexOf、replace等对编程...
这份"JAVA核心知识点整理——java自学资料.rar"包含了一份详细的Java学习资源,旨在帮助已经具备一定Java基础知识的开发者进一步提升技能,深入理解Java的底层机制。以下是这份资料可能涵盖的一些核心知识点和学习...
以下是对Java IO的详细整理: 首先,Java中的`File`类是操作文件和目录的基础,它提供了许多方法来创建、删除、重命名文件以及检查文件属性。在案例1中,通过`new File("D:\\hello.txt")`创建了一个`File`对象,...
7. **网络编程**:Java的Socket编程允许创建客户端和服务端应用,理解TCP和UDP协议,以及Socket和ServerSocket类的使用,是进行网络通信的基础。 8. **反射机制**:Java反射机制允许在运行时检查类、接口、字段和...
"140个java源码实例源码整理"这个资源集合显然提供了大量的Java编程示例,可以帮助初学者和经验丰富的开发者深入理解Java的核心概念以及实际应用。 首先,Java源码实例是学习编程的重要途径,它们提供了实际的代码...
这份"2019最全最新JAVA核心知识整理.zip"压缩包文件,显然是一份专门为Java开发者准备的面试复习资料,包含了2019年最新的Java核心技术要点。下面将详细解读这份资源可能涵盖的关键知识点。 一、基础语法 作为Java...
在“21天学会java网游编程Java实用源码整理learns”这个学习资源中,我们主要探讨的是如何在21天内快速掌握Java语言,并将其应用于网络游戏编程。这个压缩包包含了一些关键的学习材料,如“下载及使用说明.txt”提供...
这份"Java面试知识整理PDF.zip"压缩包,很显然包含了一份详细的新版Java核心面试知识点总结,旨在帮助求职者或开发者准备Java相关的面试。以下是一些可能涵盖的重要知识点: 1. **基础知识**:面试通常会从基础开始...
"java项目经验整理.zip"这个压缩包很可能包含了某位开发者在Java项目开发过程中的学习总结和实践经验,对于想要深入理解Java或者提升Java项目开发能力的人来说,这是一个宝贵的资源。 "项目经验整理.pdf"可能是文档...
这个名为"java常用技术整理.rar"的压缩包文件很可能包含了关于Java开发的各种核心技术、最佳实践以及常见问题的解决方案。以下是一些可能涵盖在压缩包中的Java技术点: 1. **基础语法**:包括变量、数据类型、...