`
vipshichg
  • 浏览: 266709 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Socket常见异常处理

    博客分类:
  • java
阅读更多

java网络编程Socket通信中,通常会遇到以下异常情况:

  第1个异常是 java.net.BindException:Address already in use: JVM_Bind。
   该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监 听。此时用netstat -an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决该问题了。
  第2个异常是java.net.ConnectException: 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进行数据的处理。如果是短连接,则不 需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体到你的程序中,就看你如何对程序进行 优化了。
7
0
分享到:
评论
3 楼 雨苣草 2014-02-18  
以前关于Socket,看到这几个异常的时候,只知道是连接异常了,不是程序问题。并未真正了解异常原因,学习了。谢谢!
2 楼 lvwenwen 2014-02-18  
总结的不错
1 楼 Tyrion 2014-02-17  
总结的不错

相关推荐

    Java+Socket+网络编程常见异常

    Java+Socket+网络编程常见异常

    java socket使用加密协议传输对象

    在编写网络程序时,异常处理和资源管理非常重要。使用try-with-resources语句可以确保所有打开的流和Socket在使用完毕后会被正确关闭,避免资源泄露。 ```java try (Socket socket = serverSocket.accept(); ...

    java socket 学习资料

    7. **异常处理**: - Java Socket编程中需要处理`IOException`,这包括连接失败、网络中断、超时等问题。 - 使用`try-catch`语句来捕获并处理这些异常,保证程序的健壮性。 8. **性能优化**: - 对于高并发场景...

    java socket 经典教程

    3. **异常处理** - Java Socket编程中常见的异常包括`IOException`、`ConnectException`、`BindException`和`SocketException`等。必须妥善处理这些异常,确保程序的健壮性。 4. **关闭Socket** - 在完成通信后,...

    JAVA SOCKET 编码实例

    5. **异常处理**:在Socket编程中,网络异常、IO异常等是常见的问题,因此需要充分考虑异常处理,确保程序的健壮性。 6. **多线程**:通常,服务器端为了同时处理多个客户端的连接,会在接收到新连接时启动新的线程...

    Java Socket 实用教程

    4. **异常处理**:网络通信中常见的异常有`IOException`,如连接超时、网络中断等,需要捕获并处理这些异常。 5. **Java Transaction API (JTA)**:相关API—Java Transaction API概述可能是关于事务管理的内容。...

    java socket教程java socket教程

    Java Socket教程是学习Java网络编程不可或缺的部分,它允许两台计算机通过网络进行通信。Socket在Java中被用作网络通信的...实践中,理解Socket的工作原理,掌握异常处理和资源管理,是提升Java网络编程能力的关键。

    java socket 网络五子棋

    在网络编程中,网络中断、服务器宕机等问题是常见的,因此需要在代码中添加适当的错误处理和异常捕获机制,以确保程序的健壮性。 七、五子棋游戏逻辑 五子棋游戏规则相对简单,但实现起来需要考虑各种特殊情况,...

    java Socket 编程源码

    3. **异常处理**: - 在Socket编程中,网络通信可能出现各种异常,如`IOException`、`SocketException`等,需要进行适当的异常捕获和处理。 4. **多线程**: - 当服务器接收到多个客户端连接请求时,通常每个连接...

    JAVA Socket远程执行任务

    - 在Socket编程中,网络连接的中断、数据传输的错误等情况很常见,需要编写良好的异常处理代码,确保程序的健壮性。 8. **文件传输**: - 文件传输时,可能需要分块传输,以适应不同的网络环境,避免大文件传输...

    java socket 聊天系统

    Java传输文件是聊天系统中常见的功能,通常采用输入流和输出流的组合来实现。例如,我们可以使用FileInputStream和FileOutputStream分别读取和写入文件,然后通过Socket的getInputStream()和getOutputStream()方法...

    java Socket心跳事例

    在这个“java Socket心跳事例”中,我们将会深入探讨如何使用Java的Socket编程来实现心跳机制,这是一种确保连接可靠性和有效性的常见策略。 心跳机制的基本思想是,两个通信端点定期交换信息,以确认连接仍然有效...

    java与c++通过socket通信

    Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...

    Java Socket聊天和文件传输工具(更新)

    源代码可以让我们看到具体的编程实践,了解如何组织和管理线程以同时处理聊天和文件传输,以及如何实现错误处理和异常恢复。文档则可能包含关于如何运行程序、配置参数以及解决常见问题的说明。 总的来说,这个Java...

    java socket编程实例(出自《java大学教程》)

    3. **异常处理与关闭资源** - Java的`try-catch-finally`语句块用于捕获和处理可能的异常,确保程序的健壮性。在Socket编程中,常见的异常包括`IOException`,如连接失败、数据传输错误等。 - 关闭Socket和相关的...

    Java Socket实现简单的web服务器

    8. **异常处理**: 在处理网络通信时,异常处理至关重要,因为网络问题如连接中断、数据传输错误等很常见。合理的异常处理可以确保程序的健壮性。 9. **代码结构与注释**: 代码的可读性和可维护性是优秀软件工程实践...

    Java Socket实现简单点对点聊天软件

    6. **异常处理**:网络通信中可能出现各种异常情况,如连接失败、数据传输错误等,因此需要充分的异常处理机制,以确保程序的稳定性和可靠性。 7. **用户界面设计**:客户端通常会使用Java Swing或JavaFX库来构建...

    java Socket连接

    5. **异常处理** 在进行Socket编程时,需要处理常见的网络异常,如 `IOException`。当网络中断、连接超时或服务器未响应时,可能会抛出此类异常。 6. **多线程处理** 如果服务器需要同时处理多个客户端连接,...

    java socket长连接客户端服务端(标准实例)

    1. **异常处理**:代码中通过try-catch块对可能出现的异常进行了捕获处理。 2. **资源释放**:虽然示例中没有明确展示资源的释放过程,但在实际开发中应该注意适当关闭不再使用的Socket连接和相关的输入输出流。 3. ...

Global site tag (gtag.js) - Google Analytics