`
jiaguwen123
  • 浏览: 413550 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

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则可以修改,这个修改只对当前窗口有效。

  • bj.rar (6.4 KB)
  • 下载次数: 0
分享到:
评论

相关推荐

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

    ### Java Socket 使用加密协议传输对象:深入解析与实践 在当今互联网时代,数据安全成为企业和个人用户关注的焦点。在Java开发中,Socket编程是一种常见的网络通信方式,它允许不同计算机上的应用程序通过网络进行...

    JAVA socket收发数据,并支持断网自动连接

    在Java编程中,Socket通信是...总结起来,实现Java Socket收发数据及断网自动连接涉及了Socket的基本使用、异常处理、重连策略、心跳机制和线程管理等多个方面。在实际应用中,需要根据具体需求进行灵活设计和优化。

    java socket 编程文档

    总结,Java Socket编程是构建网络应用的关键技术。通过理解Socket的工作原理,掌握创建、连接、通信和关闭的基本步骤,以及处理异常和优化性能的方法,开发者可以构建出健壮且高效的网络应用程序。

    java Socket 多线程

    总结来说,Java Socket多线程是构建高并发网络服务的关键技术。通过合理地设计和实现,可以有效地提升服务器的并发处理能力,为用户提供更高效的服务。在实际项目中,应根据具体需求选择适合的线程模型,例如线程池...

    java socket教程java socket教程

    总结,Java Socket教程涵盖了从基础的Socket通信机制到高级特性的全面内容。通过学习,开发者可以构建功能丰富的网络应用程序,满足各种需求。实践中,理解Socket的工作原理,掌握异常处理和资源管理,是提升Java...

    JAVA Socket 网络编程教程

    在Java中,Socket类位于java.net包下,提供了面向连接的TCP协议的实现。 二、TCP与UDP协议 1. TCP(Transmission Control Protocol):是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手建立...

    java socket 图片传输

    Java的`Socket`类提供了建立网络连接的基本功能,它是TCP/IP协议的一个封装。在Java中,可以利用Socket类创建客户端和服务器端进行数据交互。其中,`ServerSocket`类用于创建服务器端套接字,而`Socket`类用于创建...

    java socket查询数据库实现登录验证

    总结,Java Socket查询数据库实现登录验证涉及了网络编程、数据库操作以及安全性策略等多个知识点。理解并掌握这些内容对于开发安全、可靠的网络应用至关重要。在实际项目中,还需要注意异常处理、性能优化以及安全...

    Java Socket发送和接收的例子

    总结来说,Java Socket编程是构建网络应用程序的关键技术,它允许Java应用程序与其他网络上的应用程序进行双向通信。通过ServerSocket和Socket类,我们可以建立连接,交换数据,从而实现丰富的网络功能。

    java socket 网络五子棋

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

    java socket传输各种格式文件

    总结,Java Socket提供了一种强大且灵活的方式来进行文件传输。通过理解Socket的基本概念,结合文件流操作,我们可以构建出高效、安全的文件传输系统。在实际应用中,还需要考虑网络环境、错误处理、安全性等多个...

    java socket学习

    总结来说,Java Socket学习包括了TCP和UDP两种传输协议的使用,涉及`Socket`、`ServerSocket`、`DatagramSocket`等类的API,以及与之配合的`java.io`包中的输入/输出流。通过实践,你可以掌握创建连接、发送和接收...

    Java Socket实现简单的聊天程序

    总结来说,Java Socket实现的简易聊天程序是一个基础的网络通信示例,它展示了如何使用Socket进行数据交换,适用于初学者理解网络编程的基本原理。随着技能的提升,可以在此基础上添加更多的功能和优化,构建更完善...

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

    在Java中,通过`java.net.Socket`类来表示客户端,`java.net.ServerSocket`类来表示服务器端。本案例实现了基于TCP协议的Socket长连接,即客户端和服务端建立连接后,保持连接状态,进行多次数据交互而无需频繁建立...

    java实现简单socket通信

    总结来说,Java的Socket通信允许两个应用程序通过TCP协议交换数据,这在许多网络应用中都起着关键作用。通过创建ServerSocket监听连接,Socket建立连接,以及利用I/O流进行数据传输,我们可以实现窗口间的通信。对于...

    java socket开发即时通讯服务器

    总结,Java Socket在即时通讯服务器开发中扮演了基础的角色,涉及到网络编程、多线程、并发处理、协议设计等多个方面。理解并熟练运用这些技术,能够构建高效、稳定的即时通讯服务。而文件"ImWebServer"可能包含了...

    java sample socket demo

    总结起来,这个"java sample socket demo"提供了一个基础的Java Socket通信模板,可以帮助开发者理解和实践如何在Java中实现网络通信。无论是构建简单的聊天应用,还是复杂的分布式系统,Socket编程都是不可或缺的一...

    三步学会Java_Socket编程

    在Java中,Socket和ServerSocket类位于`java.net`包中。ServerSocket用于服务器端,用来监听特定端口,等待客户端的连接请求。Socket则是建立网络连接时使用的,连接成功后,服务器和客户端都会创建一个Socket实例,...

    浅出Java Socket编程

    总结,Java Socket编程是网络编程的重要组成部分,通过ServerSocket和Socket的使用,可以构建高效、可靠的网络应用程序。理解TCP/IP原理、熟悉Java I/O流操作以及掌握异常处理和资源管理,是成为熟练的Java Socket...

Global site tag (gtag.js) - Google Analytics