java socket异常_Java Socket常见异常处理

news/2024/7/8 8:34:12

在 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进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体到你的程序中,就看你如何对程序进行优化了。

6263ce22a0d072088c30cd6cda9508fc.png

顺其自然EVO 2014-02-18 11:31 发表评论


http://www.niftyadmin.cn/n/2778070.html

相关文章

山东农业大学计算机科学与技术分数,2017山东农业大学专业排名及分数线

山东农业大学学校为祖国的建设培养出一代又一代的尖端技术人才,它是一所具有浓厚文化气息的重点大学。下面就是学习啦小编给大家整理的山东农业大学排名,希望对你有用!山东农业大学排名山东农业大学在山东省排名情况山东农业大学专业排名山东农业大学专业…

用计算机计算数学公式,Formula Calculator公式计算器

小编给大家收集了一款多功能的数学公式计算器--Formula Calculator,这款计算器比起系统自带的计算器来讲,更加专业,可以计算更加复杂的数学公式,内置多种计算公式,支持多种算法解答与多种数字符号,功能非常…

2016年2月全球浏览器份额:IE第一 降幅环比增大

IDC评述网(idcps.com)03月04日报道:据市场研究公司Net Applications最新数据显示,在2016年2月份,全球范围内使用最多的浏览器是IE,其份额为44.79%,虽较上月下降了2.11%,但霸主地位暂…

html如何引用外部json,从外部URL解析json仅Html和JS

该url是一个字符串,而不是json。使用AJAX来获取数据(使用jquery)var link;$.ajax({url: "test.html",}).done(function(data) {link data;});然后,提取数据;output.innerHTMLjcontent.id;是价值。你得到这样的关键:使用function而…

海尔云悦2db微型计算机,海尔云悦mini 2w做服务器

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率三年低至5折,多种配置可选了解详情在控制台重…

java 变量共享_Java 并发编程(三):如何保证共享变量的可见性?

上一篇,我们谈了谈如何通过同步来保证共享变量的原子性(一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行),本篇我们来谈一谈如何保证共享变量的可见性(多个线程访问同一个变量时,一个线程修改了…

技术学校有哪些专业计算机,计算机多媒体技术学校有哪些

计算机多媒体技术学校有哪些随着计算机多媒体技术的不断发展,计算机多媒体技术对社会的贡献和影响也是越来越大,多媒体技术融合多种通信功能于一体并借助日益普及的高速信息网,可实现计算机的全球联网和信息资源共享,因此被广泛应…

java 服务降级_SpringCloud中如何实现Hystrix服务降级-百度经验

【microcloud-consumer-service】修改IDeptClientService接口,追加本地的Fallback配置。package com.gwolf.service;import com.gwolf.microcloud.commons.config.FeignClientConfig;import com.gwolf.service.fallback.IDeptClientServiceFallbackFactory;import c…