`
wenjinglian
  • 浏览: 824861 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

[ava.net.SocketException四大异常解决方案

阅读更多

 

java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题。希望大家有所帮助。那么我们就来看看有关java.net.SocketException的相关知识。

 

第1个异常是 java.net.BindException:Address already in use: JVM_Bind

 

该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

 

 

 

 

第2个异常是java.net.SocketException: Connection refused: connect

 

该异常发生在客户端进行 new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。

 

第3个异常是java.net.SocketException: Socket is closed

 

该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

 

第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)

 

该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

 

第5个异常是java.net.SocketException: Broken pipe。

 

该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。

 

编写网络程序时需要注意的问题

 

第1个问题是要正确区分长、短连接。所谓的长连接是一经建立就永久保持。短连接就是在以下场景下,准备数据—>建立连接— >发送数据—>关闭连接。很多的程序员写了多年的网络程序,居然不知道什么是长连接,什么是短连接。

 

第2个问题是对长连接的维护。所谓的维护包括两个方面,首先是检测对方的主动断连(既调用 Socket的close方法),其次是检测对方的宕机、异常退出及网络不通。这是一个健壮的通信程序必须具备的。检测对方的主动断连很简单,主要一方主动断连,另一方如果在进行读操作,则此时的返回值只-1,一旦检测到对方断连,则应该主动关闭己方的连接(调用Socket的close方法)。

 

而检测对方的宕机、异常退出及网络不通常用方法是用“心跳”,也就是双方周期性的发送数据给对方,同时也从对方接收“心跳”,如果连续几个周期都没有收到对方心跳,则可以判断对方或者宕机或者异常推出或者网络不通,此时也需要主动关闭己方连接,如果是客户端可在延迟一定时间后重新发起连接。虽然Socket有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。

 

第3个问题是处理效率问题。不管是客户端还是服务器,如果是长连接一个程序至少需要两个线程,一个用于接收数据,一个用于发送心跳,写数据不需要专门的线程,当然另外还需要一类线程(俗称Worker线程)用于进行消息的处理,也就是说接收线程仅仅负责接收数据,然后再分发给Worker进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体怎么设计你的程序,就看你自己的设计水平了。

 

来自:http://developer.51cto.com/art/201003/189724.htm

 

分享到:
评论

相关推荐

    在Win7系统下抛出java.net.SocketException的解决办法

    解决上述问题的关键在于解决最初的`java.net.SocketException`异常,因为一旦解决了这一问题,后续的异常往往也会随之消失。具体步骤如下: 1. **配置JVM参数**:在启动JVM时添加参数`-Djava.net.preferIPv4Stack=...

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法 JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是...

    java.net.SocketException Connection reset 解决方法

    "java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...

    java.net.SocketException: No route to host 异常原因

    NULL 博文链接:https://zhoudan241.iteye.com/blog/1432014

    java.net.SocketException: Connection reset 解决方法

    一种可能的解决方案是限制在特定时间间隔内的请求次数,或者采用更智能的重试策略,比如在检测到异常时等待一段时间再进行重试,而不是立即重试。此外,确保在完成数据获取后及时关闭Socket连接,避免资源浪费和潜在...

    java.net.SocketException(解决方案).md

    项目中碰到的,记录一下解决方案

    http接口调用报错.rar

    接口调用报错:java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory

    Linux下打开的文件过多错误

    Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:

    Java Socket常见异常处理

    4. **java.net.SocketException: (Connection reset 或 Connect reset by peer: Socket write error)** 这两种异常都表示连接已断开。可能的原因是一端关闭了Socket,而另一端仍在尝试读写。处理这类异常需要检测到...

    connection reset解决方案(亲测可用).md

    connection reset解决方案(亲测可用).md

    JMeterPlugins-Standard.jar和JMeterPlugins-Extras.jar.rar

    “JMeterPlugins-Extras.jar”则更加专注于提供高级功能和特定场景的解决方案,其中包括: 1. **模块控制器**:Extras插件引入了模块控制器,允许用户在测试计划中重用已有的线程组,提高了测试计划的复用性和灵活...

    C#socket通讯两个最经典错误解决方案

    可以捕获 `System.Net.Sockets.SocketException` 异常,并根据实际情况给予用户相应的提示,然后从当前执行路径退出。这样可以避免程序因异常而完全崩溃。 ```csharp try { // 尝试执行网络操作 } catch ...

    System.SR.dll 无法显示错误信息

    System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ---> System.Net.Sockets.SocketException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ...

    fastdfs使用java

    【FastDFS简介】 FastDFS是一个高效且开源的分布式文件系统,设计目标是为互联网环境提供文件存储、同步和访问服务。它的核心特点是轻量级、高可用性和高性能,能够轻松应对大容量存储需求并实现负载均衡。...

    ssh2必须的包(这是第二部分)

    2. **jbosscache-core-3.2.1.GA.jar** - 这是JBoss Cache的一个版本,它是一个分布式缓存解决方案,用于存储和同步数据。在SSH2环境中,可能用于缓存认证信息或共享状态数据。 3. **infinispan-core-4.2.1.CR1.jar*...

    java网络编程示例

    import java.net.SocketException; public class UDPServer { public static void main(String[] args) { try { byte [] buffer = new byte[1024]; DatagramSocket socket = new DatagramSocket(4444); ...

    Google I/O 2013推荐Android 网络通信框架Volley

    5. **错误处理**:Volley提供了一套完整的错误处理机制,包括重试策略和错误回调,可以帮助开发者更好地理解和处理网络异常。 6. **强大的请求类型**:Volley支持GET、POST等多种HTTP方法,还可以处理HTTP头和POST...

    Socket长连接异常处理

    下面将详细介绍这些异常情况,并提供解决方法。 java.net.BindException: Address already in use 该异常发生在服务器端进行 new ServerSocket(port) 操作时,原因是因为与 port 相同的端口已经被占用,解决方法是...

    Hive2Hive-master.rar

    解决方案可以是采用增量同步,只传输自上次同步以来的变化数据。 - **数据一致性**:为了保证数据一致性,可能需要引入分布式事务和锁机制,确保数据在源和目标Hive之间的完整性和一致性。 - **错误处理**:网络...

Global site tag (gtag.js) - Google Analytics