socket常见几种异常

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

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

使用Java JDK中Java.net包控制UDP协议

通过Java.net.Socket类抓取网页内容

通过java.net.Socket类抓取网页内容

通过Java.net包建立双向通讯

用来访问HTTP服务器的仿java.net功能类

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

该异常发生在客户端进行 newSocket(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或者Connectreset by peer:Socket write error)。

原因 :用户在发送一个请求后,再次发送另一个请求,导致第一个请求中断或者

①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
②:客户关掉了浏览器,而服务器还在给客户端发送数据;
③:浏览器端按了Stop

该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的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进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体怎么设计你的程序,就看你自己的设计水平了。

第六个异常,ava.net.SocketException:Too many open files
原因:操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。
解决方式: 
   a) 尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
  b) java的GC不能关闭网络连接打开的文件句柄,如果没有执行close()则文件句柄将一直存在,而不能被关闭。也可以考虑设置socket的最大打开数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量。ulimit -a可以查看系统目前资源限制,ulimit -n 10240则可以修改,这个修改只对当前窗口有效

时间: 2024-07-31 14:25:49

socket常见几种异常的相关文章

C++中常见的几种异常类型

1.C++具有完善的异常捕获机制,采用try{}  catch(){}机制,这是C语言无法比拟的 2.常见的几种异常: bad_alloc:       请求分配内存失败, operator new 或者 operator new [] bad_exception: 函数异常,通常是函数运行错误,抛出的异常 bad_typeid:   类型异常,通常用typeid操作符,作用于一个NULL指针时,而该指针是带有虚函数的类,这时抛出bad_typeid异常 bad_cast:    转换异常,使用

常见的几种异常类型-熟记

今天把几个常见的异常总结一下,希望自己能熟记,别忘记!!! 1.NullPointerException: 空指针异常.菜鸟编程经验发现这个异常是经常会发生的,属于运行时异常. 举例: public static void main(String[] args) {String str = null;//此处报空指针异常System.out.println(str.length());} 控制台输出的异常信息为: Exception in thread "main" java.lang

Java Socket常见异常处理 和 网络编程需要注意的问题

在java网络编程Socket通信中,通常会遇到以下异常情况: 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.异常的原因是以为与port一样的一个端口已经被启动,并进行监听.此时用netstat -an命令,可以看到一个Listending状态的端口.只需要找一个没有被占用的端口就能解决该问题了. 第

Socket的几种

socket模型: 1.阻塞模型 一个单进程accept阻塞,接收到客户端请求后,read消息,处理write返回,然后循环继续accept. 这种模型最最简单,不实际,没什么实际用途,对于新手教学还行. 2.多进程(线程)模型 主进程循环accept阻塞,接收到客户端请求后,fork子进程处理,子进程read阻塞,接收客户端消息并响应. 这种模型是我使用到最多的,简单实用,但是当客户端请求超多时,fork子进程多,系统资源消耗大,效果不理想:当然这种与多线程同理. 3.进程池(线程池) 主进程

Java虚拟机结构及常见内存溢出异常

每个Java虚拟机都有一个类加载器子系统,根据某个全限定名来装入类型,同样每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令. 当虚拟机运行一个程序时,就需要从已加载的文件中得到信息,将这些信息组织到运行时数据区,以便于管理. Java运行时的数据区域划分 1.程序计数器:程序计数器是一块较小的内存空间,可以看做是当前线程的字节码的行号指示器. Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个时刻,一个处理器只会执行一条线程中的指

数据分析师:数据分析工作常见七种错误及其规避技巧(转自经管之家)

数据分析师:数据分析工作常见七种错误及其规避技巧商业领域的数据科学家和侦探类似:去探索未知的事物.不过,当他们在这个旅程中冒险的时候,他们很容易落入陷阱.所以要明白,这些错误是如何造成的,以及如何避免.“ ... 数据分析师:数据分析工作常见七种错误及其规避技巧 商业领域的数据科学家和侦探类似:去探索未知的事物.不过,当他们在这个旅程中冒险的时候,他们很容易落入陷阱.所以要明白,这些错误是如何造成的,以及如何避免. “错误是发现的入口.”——James Joyce (著名的爱尔兰小说家). 这在

编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常

建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Exception,然后按快捷键Tab,VS会自动创建一个自定义异常类: [Serializable] public class MyException : Exception { // // For guidelines regarding the creation of new exception types

C++ socket编程——3种方法发送不同类型的数据

socket传送数据,一般来讲是char型的,如何传送我们需要的数据类型勒? 1.结构体:2, Json序列化,3. 定义一个class. 1.结构体 相对来说简单点,看看网上的一个例子: 假设需要传送的结构体如下: struct person{ char name[20]; int age; float high; }; 可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可. 发送方代码如下: char temp[100];   

ARM七种异常源和异常处理流程(四大步三小步)

ARM七种异常源和异常处理流程 2014-11-30  北京海淀区  张俊浩 ARM七种异常源及其工作模式                                                                                             异常源                                              含义                      ARM工作模式