`
bao231
  • 浏览: 87415 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Java Socket 网络编程常见异常

 
阅读更多

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+网络编程常见异常

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

    Java网络编程案例教程习题参考答案 .pdf

    包括Socket编程、TCP/IP协议、Java Socket类、ServerSocket类、Java网络编程模型、网络编程常见问题、多线程编程、并发编程、Socket选项、网络安全、数据传输、网络协议、Socket超时、网络异常处理等。

    java socket网络编程代码(服务端和客户端)

    在Java Socket编程中,重要的是理解I/O流的概念,因为数据是以字节流的形式在网络中传输的。同时,为了提高服务器的并发能力,通常会为每个客户端连接创建新的线程或使用线程池来处理请求。在实际项目中,还需要考虑...

    java的Socket编程

    Java的Socket编程是Java网络编程的核心部分,它提供了在TCP/IP协议栈上进行通信的机制。Socket接口是对TCP/IP协议的抽象,使得开发者能够轻松地创建客户端和服务器应用程序,实现网络上的数据交换。在这个主题中,...

    java socket 网络五子棋

    在Java中,`java.net.Socket`和`java.net.ServerSocket`类是Socket编程的核心。ServerSocket用于监听客户端连接请求,而Socket则代表一个网络连接,用于数据的收发。 二、服务器端实现 1. 创建ServerSocket实例,...

    Java网络编程/Java网络编程实例

    1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过ServerSocket创建服务器端,Socket创建客户端,两者建立连接后可以进行双向数据传输。例如,你可以构建一个简单的聊天应用或文件...

    利用Socket进行Java网络编程.zip_java socket _java 网络编程_java 聊天_socket jav

    总的来说,Java Socket编程是构建网络应用的基础,它涵盖了网络通信的核心原理,通过学习和实践,你可以创建自己的聊天应用或其他基于网络的项目。记住,实践是最好的老师,动手编写代码并运行测试是掌握这项技能的...

    java Socket 编程源码

    Java Socket编程是网络编程的基础,它提供了在Java中进行低级网络通信的接口。Socket是TCP/IP协议族的一部分,用于实现客户端与服务器之间的双向通信。在这个"java TCP_IP Socket 编程"源码中,我们可以深入理解...

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

    在Socket编程中,常见的异常包括`IOException`,如连接失败、数据传输错误等。 - 关闭Socket和相关的流是至关重要的,以防止资源泄露。`Socket`和`ServerSocket`都有`close()`方法,确保在完成通信后调用。 4. **...

    java的socket编程课件~~~

    - Socket编程中常见的异常有`IOException`、`ConnectException`、`SocketTimeoutException`等,必须妥善处理这些异常,确保程序的健壮性。 5. **关闭资源**: - 通信完成后,记得关闭Socket以及相关的输入/输出流...

    Java Socket编程:文件传输.doc

    文件传输是 Java Socket 编程中的一种常见应用场景,通过建立客户端和服务器端之间的连接,实现文件的上传和下载。 从给定的文件中,我们可以看到,文件传输服务器端使用了 Java Socket 编程技术,通过 ...

    Java网络编程第三版.pdf

    1. **Java网络编程基础**:首先,书中会介绍Java中的Socket编程,包括TCP和UDP协议的基础知识,以及如何使用Java的Socket和ServerSocket类创建客户端和服务器端的连接。 2. **I/O与NIO**:Java的I/O流系统是网络...

    java网络编程 socket

    通过阅读《Java网络编程文档教材》和《Java基础三步学会JavaSocket编程》,你可以更深入地了解Java Socket编程的细节和实践技巧。理论结合实践,才能真正掌握这一技术。在实际开发中,不断优化和调试,才能编写出...

    JAVA网络编程常见问题与答案

    JAVA 网络编程常见问题与答案 本文将详细讲解 JAVA 网络编程中常见问题与答案,涵盖 TCP 连接和断开、SOCKET 语句、端口扫描、互联网上两台计算机的通信方式、TCP/IP 网络分层模型、多线程程序设计对计算机性能的...

    Java Socket 实用教程

    学习Java Socket编程不仅需要理解TCP/IP协议的基础知识,还需要掌握Java I/O流的使用,以及如何在实际应用中设计健壮的网络服务。在实践过程中,可以编写简单的客户端和服务器端程序,通过交互来加深理解。同时,...

    《Java程序设计之网络编程》

    2. **Socket编程**:Java的Socket类和ServerSocket类是进行网络通信的核心。ServerSocket创建一个监听端口,等待客户端的Socket连接。当客户端的Socket连接到服务器时,它们之间就建立了一条通信通道,可以进行双向...

    Java网络编程socket

    在Socket编程中,常见的异常有`IOException`、`UnknownHostException`、`SocketException`等,需要进行适当的捕获和处理。例如,客户端可能因服务器未启动或网络问题无法连接,服务器也可能因为并发连接过多而拒绝新...

    JAVA Socket远程执行任务

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

    Java基于socket的进程间通信 聊天小程序

    6. **输入/输出流**: 在Java的Socket编程中,数据通过输入流和输出流进行读写。ServerSocket和Socket都有相关的输入流和输出流对象,例如InputStream和OutputStream,用于接收和发送数据。 7. **聊天小程序设计**: ...

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

    在Java开发中,Socket编程是一种常见的网络通信方式,它允许不同计算机上的应用程序通过网络进行交互。然而,对于涉及敏感信息的应用场景,如金融交易、个人隐私数据处理等,仅仅依靠Socket的基础功能是远远不够的,...

Global site tag (gtag.js) - Google Analytics